java8新特性-lambda表达式

xiaoxiao2021-02-28  25

java10都要来了,才才才说java8新特性?好吧,大神,再见,这不是写给你看的 -_-! 为什么要要使用lambda表达式? lambda表达式能以简洁的代码代替复杂、啰嗦的代码,也更易阅读! 最后也附上简单的性能测试,总体上数量越大,lambda性能越好,可能不同的业务逻辑及方法都不会一样,仅供参考! 没有理论,上来就撸代码!

public class LambdaTest extends BaseTest { @Data @AllArgsConstructor public class Apple { private int weight; private Double price; private String color; } public interface Predicate<T> { boolean test(T t); } private List<Apple> apples; @Before public void init() { apples = Arrays.asList( new Apple(115, 1.2, "red"), new Apple(4, 1.5, "red"), new Apple(3, 2.2, "green"), new Apple(10, 1.2, "green"), new Apple(11, 0.2, "red"), new Apple(2, 2.2, "green") ); } @Test public void sortTest() { //一般排序 apples.sort(new Comparator<Apple>() { @Override public int compare(Apple o1, Apple o2) { return o1.getWeight() - o2.getWeight(); } }); Assert.assertEquals(apples.get(0).getWeight(), 2); } @Test public void lambdaSortTest() { //lambda排序 是不是简洁很多 并且也好理解 apples.sort((Apple o1, Apple o2) -> o1.getWeight() - o2.getWeight()); //可以去掉参数类型,通过上下文推断 个人还是加上参数类型,不介意多敲几个代码 //apples.sort((o1, o2) -> o1.getWeight() - o2.getWeight()); Assert.assertEquals(apples.get(0).getWeight(), 2); } @Test public void searchTest() { //一般匿名查询 List<Apple> list = filter(apples, new Predicate<Apple>() { @Override public boolean test(Apple apple) { return apple.getColor().equals("green"); } }); Assert.assertEquals(list.get(0).getColor(), "green"); } @Test public void lambdaSearchTest() { //lambda匿名方法查询 要理解函数式接口,通俗点讲就是一个接口中,只有一个方法 List<Apple> list = filter(apples, (Apple o1) -> o1.getColor().equals("grenn")); Assert.assertEquals(list.get(0).getColor(), "green"); } @Test public void lambdaBlockTest() { //代码块,可赋值 Runnable run = () -> System.out.println("Thread run********"); Thread t = new Thread(run); t.run(); } @Test public void functionTest() { //方法引用,可以看做是lambda的快捷写法 如果允许可以大胆的使用 比lambda更简洁 //再借用Function 包,可以省去很多代码 // //方法引用排序,主要排序规则在comparing方法中实现 apples.sort(comparing(Apple::getWeight)); Assert.assertEquals(apples.get(0).getWeight(), 2); //使用String的length方法,下面对应参数自身的length方法 Function<String, Integer> function = String::length; Integer len = function.apply("123"); Assert.assertEquals(len, (Integer) 3); } @Test public void compositeTest() { //lambda复合,其实就是执行多个条件,这主要是基于function包的工具类的实现,实现很简单 //使用的接口默认方法,也是java8中的新特性, java.util.function.Predicate<Apple> predicate = (Apple o1) -> o1.getPrice() > 1.0; predicate.and(a -> a.getWeight() > 5) .or(a -> "green".equals(a.getColor())); } @Test public void test() { //简单的性能测试 apples = new ArrayList<>(); int max = 10000; for (int i = 0; i < max; i++) { apples.add(new Apple(max - i, 2.0, "")); } long t1 = new Date().getTime(); sortTest(); long t2 = new Date().getTime(); lambdaSortTest(); long t3 = new Date().getTime(); System.out.println("for:" + (t2 - t1)); System.out.println("lambda:" + (t3 - t2)); //性能旗鼓相当,数据量少的时候 for性能要好于lambda,反之亦然 //当max为10000的时候,lambda就好于for了,当然这只是粗略的测试 } private <T> List<T> filter( List<T> list, Predicate<T> predicate) { List<T> realList = new ArrayList(); for (T t : list ) { if (predicate.test(t)) { realList.add(t); } } return realList; } }
转载请注明原文地址: https://www.6miu.com/read-2621769.html

最新回复(0)