java 8 函数式编程

佚名 / 2023-08-13 / 原文

函数式编程

1. Lambda 表达式

1.1 概念

对某些匿名内部类的写法优化,特点是可推导可省略。基本格式:(参数列表) -> {代码}

  • 例如:
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("运行进程");
            }
        }).start();

就可以优化为

new Thread(() -> System.out.println("运行进程")).start();

优化规则可以不记,使用Idea快捷键Alt+Enter可以自动优化写法。

2. Stream 流

2.1 概述

java8的Stream使用的是函数式编程,可以对集合或者数组进行链状流式的操作。

2.2 常用操作

2.2.1 创建流

  • 单列集合:集合对象.stream()。实际开发用的最多
  • 数组对象:Arrays.stream(数组)或者Stream.of(数组)
  • 双列集合:转换成单列集合后在创建流。例如:
        HashMap<String, String> map = new HashMap<>();
        map.put("a","A");
        map.put("b","B");
        map.put("c","C");
        Stream<Map.Entry<String, String>> stream = map.entrySet().stream();

流对象的泛型对象就是集合的泛型对象

2.2.2 中间操作

a. filter

过滤操作,符合条件才能保留在流当中。

        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.stream().filter((item) -> item.startsWith("a")).forEach((item) -> System.out.println(item));// a开头的才能留在流当中

输出结果:

abc
acd

b. map

对流当中的元素计算或者转换。

        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bcd");
        list.add("acd");
        list.stream().map(item->item.toCharArray()).forEach(item-> System.out.println(item.length));//String转换成char数组
        list.stream().map(s->s+"**").forEach(s-> System.out.println(s));//每个元素增加**

输出:

3
3
3
abc**
bcd**
acd**

c. distinct

去重:需要流当中的元素重写hashCode和equals方法。

        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bcd");
        list.add("acd");
        list.add("acd");
        list.stream().distinct().forEach(s-> System.out.println(s));//输出:abc bcd acd
d. sorted

对流中的元素排序:该方法俩个重载方法可以在sorted中通过入参匿名内部类定义比较 也可以流中的元素本身实现Comparator接口

        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bcd");
        list.add("acd");
        list.add("acd");
        list.stream().sorted().forEach(s-> System.out.println(s));