Java8的stream使用示例
        2021-03-02 15:07:45
                Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码
```
package com.example;
import java.util.*;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toSet;
class Foo {
    private int num;
    public Foo(int num) {
        this.num = num;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    @Override
    public String toString() {
        return "Foo{" + "num=" + num + '}';
    }
}
public class Demo {
    public static void main(String[] args) {
        List<Foo> list = new ArrayList<>();
        list.add(new Foo(3));
        list.add(new Foo(8));
        list.add(new Foo(2));
        list.add(new Foo(5));
        list.add(new Foo(2));
        // 过滤筛选 (只留下偶数)
        List<Foo> list2 = list.stream().filter((a) -> {
            return a.getNum() % 2 == 0;
        }).collect(toList());
        System.out.println(list2);
        // 倒序
        List<Foo> list3 = list.stream().sorted(Comparator.comparing(Foo::getNum).reversed()).collect(toList());
        System.out.println(list3);
        // 倒序
        List<Foo> list4 = list.stream().sorted((a, b) -> {
            return a.getNum() < b.getNum() ? 1 : -1;
        }).collect(toList());
        System.out.println(list4);
        // 得取某一字段值,并去重
        Set<Integer> numbers = list.stream().map((item) -> {
            return item.getNum();
        }).collect(toSet());
        System.out.println(numbers);
        // 转Map,指定列作为key。下面这种方式,Key冲突时会抛异常 java.lang.IllegalStateException: Duplicate key Foo{num=2}
        // Map<Integer, Foo> fooMap = list.stream().collect(Collectors.toMap(Foo::getNum, item -> item));
        // key冲突时使用后一个覆盖前一个同名key的value
        Map<Integer, Foo> fooMap = list.stream().collect(Collectors.toMap(Foo::getNum, item -> item, (n1, n2) -> { return n2; }));
        // 第四个参数 用于自定义返回 Map 类型,比如我们希望返回的 Map 是根据 Key 排序的,可以使用如下写法
        // Map<Integer, Foo> fooMap = list.stream().collect(Collectors.toMap(Foo::getNum, item -> item, (n1, n2) -> { return n2; }, TreeMap::new));
        System.out.println(fooMap);
        // 以某个属性分组
        Map<Integer, List<Foo>> listMap = list.stream().collect(Collectors.groupingBy(Foo::getNum));
        System.out.println(listMap);
        // Set to List
        Set<String> nameSet = new HashSet<String>() {{
            add("jack");
            add("mary");
        }};
        // List<String> nameList = nameSet.stream().collect(toList());
        List<String> nameList = new ArrayList<>(nameSet);
        System.out.println(nameList);
    }
}
```
运行结果如下:
```
[Foo{num=8}, Foo{num=2}, Foo{num=2}]
[Foo{num=8}, Foo{num=5}, Foo{num=3}, Foo{num=2}, Foo{num=2}]
[Foo{num=8}, Foo{num=5}, Foo{num=3}, Foo{num=2}, Foo{num=2}]
[2, 3, 5, 8]
{2=Foo{num=2}, 3=Foo{num=3}, 5=Foo{num=5}, 8=Foo{num=8}}
{2=[Foo{num=2}, Foo{num=2}], 3=[Foo{num=3}], 5=[Foo{num=5}], 8=[Foo{num=8}]}
[mary, jack]
```
去重
```
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
list.add(4);
list.add(2);
list.add(4);
List<Integer> list2 = list.stream().distinct().collect(Collectors.toList());
System.out.println(list2);
```
得到如下结果:
[1, 4, 2]