栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

简述函数式编程(Lambda表达式、Stream流、Optional类)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

简述函数式编程(Lambda表达式、Stream流、Optional类)

目录

1. 概论

1.1 为什么学习?1.2 函数式编程思想 2. Lambda表达式3. Stream流4. Optional

1. 概论 1.1 为什么学习?

大数量下处理集合效率高代码可读性高接近自然语言,易于理解易于并发编程代码简洁开发快速 1.2 函数式编程思想

不关心是哪个对象,甚至是方法名是什么,函数式编程关心数据的映射。

2. Lambda表达式

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。使用Lambda表达式可以使代码变得更加简洁。
核心原则:可推到可省略
Lambda表达式的语法如下:

(parameters) -> expression
或
(parameters) ->{ statements; }

Java中的一些没有意义的语法可以省略,函数名这些都可以省去。函数式编程只关注具体的参数列表和方法体,从下面代码就可以发现

public class LambdaTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("被执行");
            }
        }).start();

        new Thread(() -> {
            System.out.println("新线程被执行了");
        }).start();
    }
}

在idea中可以使用Alt+Enter快捷键切换Lambda表达式,也可以再次切换回来。

省略规则:
1.抽象方法中参数的类型可以省略。

2.当抽象方法的参数只有一个的时候,小括号可以省略。

3.当大括号中语句只有一条的时候,大括号,语句后面的分号和return关键字都可以省略。
下面是省略后的Lambda表达式

public class LambdaTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("被执行");
            }
        }).start();
        //省略后的Lambda表达式
        new Thread(() ->System.out.println("新线程被执行了")).start();
    }
}
3. Stream流

什么是 Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作。Stream流可以对集合和数组进行操作的。
对于Stream的快速入手

public class LambdaTest {
    public static void main(String[] args) {
        List ls = new ArrayList();
        ls.add(12);
        ls.add(10);
        ls.add(18);
        ls.add(18);
        //集合转化为流
        ls.stream()
                //去重
                .distinct()
                //筛选出来大于10的
                .filter(new Predicate() {
                    @Override
                    public boolean test(Integer integer) {
                        return integer>10;
                    }
                })
                //打印
                .forEach(new Consumer() {
                    @Override
                    public void accept(Integer integer) {
                        System.out.println(integer);
                    }
                    });

    }
}

这里可以优化为Lambda表达式

public class LambdaTest {
    public static void main(String[] args) {
        List ls = new ArrayList();
        ls.add(12);
        ls.add(10);
        ls.add(18);
        ls.add(18);
        //集合转化为流
        ls.stream()
                //去重
                .distinct()
                //筛选出来大于10的
                .filter(integer -> { return integer>10; })
                //打印
                .forEach(integer -> System.out.println(integer));
    }
}

这里我们可以用idea的debug来查看下具体的过程,在这里打下断点,并查看具体过程。

    去重过程
    筛选过程
    打印输出
    在这里forEach是作为终结操作,若没有终结操作则不会生效。若用过终结操作不会再进行其他操作,会将流关闭。
    常见的终结操作
    void forEach(Consumer action) 对此流的每个元素执行操作
    long count() 返回此流中的元素数
4. Optional

Optional 类的引入很好的解决空指针异常,当我们传入null值时并不会报空指针异常的错误。

public class LambdaTest {
    public static void main(String[] args) {
        String value = null;
        // Optional.ofNullable 允许传递null 参数
        Optional a = Optional.ofNullable(value);
    }
}

如果使用Optional.of 且参数是 null,则会抛出异常 NullPointerException,如果非要使用Optional.of方法可以和Optional.empty()方法结合使用。通过Optional.empty()方法返回空的 Optional 实例。
Optional还有很多的方法,可以自行查看。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749025.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号