java8新特性-lambda表达式

本文介绍Java8中Lambda表达式的应用,通过实例演示如何利用Lambda简化代码,并提高可读性和性能。涵盖排序、过滤、复合操作等常见场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值