天天看點

Java8 Stream 真香,趕緊來舔一舔

如今

Java14

已經釋出許久了,

Java15

也在路上跑着了,然鵝不少小夥伴

Java8

API

應該還沒用溜吧!今天跟各位小夥伴們聊聊

Java Stream API

的具體使用方法以及應用場景。

舉哥簡單的例子,定義一個數組:

String[] users = new String[]{"張三","李四","王二"};           

我們來使用之前的方式周遊:

for(int i=0;i<users.length;i++){
    System.out.println(users[i]);
}           

亦或者使用:

for(String u:users){
   System.out.println(u);
}           

使用最新的

API

實作方式:

Stream<String> stream = Stream.of(users);
stream.forEach(user-> System.out.println(user));           

然鵝好像并沒有多麼友善,僅僅少撸了一行代碼,下面跟大家分享一個稍微複雜一點的例子。

首先定義一個學生類:

@Data
@Builder
public class Student {
    private String name;
    private Integer age;
    private Integer sex;
    private Double score;
}           

定義基礎資料:

List<Student> list = new ArrayList<>();
list.add(new Student("張三",28,1,78.9));
list.add(new Student("李四",20,1,98.0));
list.add(new Student("王二",29,0,100.0));
list.add(new Student("張三",28,1,78.5));
Stream<Student> stream = list.stream();           

周遊:

stream.forEach(stu-> System.out.println(stu.getName()));           

過濾性别:

stream.filter(stu -> stu.getSex()==1)
                .forEach(stu -> System.out.println(stu.getName()));           

名字去重:

stream.distinct().forEach(stu -> System.out.println(stu.getName()));           

年齡排序:

stream.sorted(Comparator.comparingInt(Student::getAge))
                .forEach(stu -> System.out.println(stu.getName()));           

排序反轉:

stream.sorted(Comparator.comparingInt(Student::getAge).reversed())
                .forEach(stu -> System.out.println(stu.getName()));           

姓名集合:

List<String> userList = stream.map(stu -> stu.getName())
                .collect(Collectors.toList());           

分數求和:

Optional<Double> totalScore = stream.map(Student::getScore)
                .reduce((x, y) -> x+y);
System.out.println(totalScore.get());           

求分數最大值:

Optional<Double> maxScore = stream.map(Student::getScore).reduce(Double::max);           

求分數最小值:

Optional<Double> minScore = stream.map(Student::getScore).reduce(Double::min);           

取前三名同學:

stream.sorted(Comparator.comparingDouble(Student::getScore).reversed())
                .limit(3)
                .forEach(System.out::println);           

扔了前三名同學:

stream.sorted(Comparator.comparingDouble(Student::getScore).reversed())
                .skip(3)
                .forEach(System.out::println);           

卧槽太多了,撸主舉不過來了,但是基本上常用的就這麼幾個。函數式程式設計寫出的代碼更加簡潔且意圖明确,使用

stream

接口讓你從此告别

for

循環,小夥伴們趕緊入坑享受吧!!!

作者: 小柒

出處:

https://blog.52itstyle.vip