開發與維運

最常用的 Java 8 中的 Lambda 函數(項目中實用筆記)

最常用的 Java 8 中的 Lambda 函數(項目中實用筆記)

在這裡插入圖片描述

簡介

Java 8 中的新特性,雖然現在都出到了Java14版本,不過在日常的開發過程中,8的版本是足夠使用了,再說現在的8以上的版本也都面向商業收費了,很多新手,我所接觸到的,像我那時候一樣,追求船新版本,一上來就去學java14的東西,當成一個愛好還行,重心還是要放在實用上

過濾

需求:我需要過濾高考分數大於500的人

首先,新建一個內部類

    static class Student{
        private String name;
        private Integer score;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name!=null ? name.trim() : null;
        }

        public Integer getScore() {
            return score;
        }

        public void setScore(Integer score) {
            this.score = score;
        }

        public Student(String name, Integer score) {
            this.name = name;
            this.score = score;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    "}\n";
        }
    }

使用IntStream遍歷快速初始化一批值

    public static void main(String[] args) {
      List<Student> studentList =  IntStream.rangeClosed(0,20)
                .mapToObj(i -> new Student("Java Pro"+i,490+i))
                .collect(Collectors.toList());
    }

過濾出分數大於500的並輸出

        List<Student> studentGiao = studentList.stream()
              .filter(student -> student.score > 500)
              .collect(Collectors.toList());
        System.out.println(studentGiao.toString());

輸出:

[Student{name='Java Pro11', score=501}
, Student{name='Java Pro12', score=502}
, Student{name='Java Pro13', score=503}
, Student{name='Java Pro14', score=504}
, Student{name='Java Pro15', score=505}
, Student{name='Java Pro16', score=506}
, Student{name='Java Pro17', score=507}
, Student{name='Java Pro18', score=508}
, Student{name='Java Pro19', score=509}
, Student{name='Java Pro20', score=510}
]

日常求和

需要考慮到為空和為0的情況

package com.github.gleans;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class LambdaLearning {
    public static void main(String[] args) {
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        double resNum = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .sum();
        System.out.println(resNum);
    }
}

map是重新指向一個對象,把->右側的對象賦予,此處判斷若num為null則賦予0值
注意,這裡不可給null使用filter過濾掉,否則全為null的情況,會報空指針異常

擴展計算

    public static void testTwo(){
        List<Double> nums = Arrays.asList(1.01, 2.11, 3.23, 4.222, null, 5.6);
        DoubleSummaryStatistics number = nums.stream()
                .map(num -> Objects.isNull(num) ? 0 : num)
                .mapToDouble(num -> num)
                .summaryStatistics();
        System.out.println("最大值:"+number.getMax());
        System.out.println("最小值:"+number.getMin());
        System.out.println("平均值:"+number.getAverage());
    }

輸出

最大值:5.6
最小值:0.0
平均值:2.6953333333333336

reduce簡單使用

    public static void main(String[] args) {
        testOne();
    }

    public static void testOne(){
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
        // 這裡的 10 相當於初始值
        int sum = numbers
                .stream()
                .reduce(10, Integer::sum);
        System.out.println(sum);
    }

Collectors.groupingBy

根據年齡分組

package com.github.gleans;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class SumWage {
    public static void main(String[] args) {
        List<UserDemo> userDemoList = new ArrayList<UserDemo>() {{
            add(new UserDemo(20, "jason", BigDecimal.valueOf(1000000)));
            add(new UserDemo(22, "yasuo", BigDecimal.valueOf(2000000)));
            add(new UserDemo(22, "ekko", BigDecimal.valueOf(100)));
        }};
        Map<Integer, List<UserDemo>> UserDemoMapByAge = userDemoList.stream()
                .collect(Collectors.groupingBy(UserDemo::getAge));
        System.out.println(UserDemoMapByAge.toString());
    }

    static class UserDemo {
        private int age;
        private String username;
        private BigDecimal wage;

        public UserDemo(int age, String username, BigDecimal wage) {
            this.age = age;
            this.username = username;
            this.wage = wage;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public BigDecimal getWage() {
            return wage;
        }

        public void setWage(BigDecimal wage) {
            this.wage = wage;
        }

        @Override
        public String toString() {
            return "UserDemo{" +
                    "age=" + age +
                    ", username='" + username + '\'' +
                    ", wage=" + wage +
                    '}';
        }
    }
}

輸出

{20=[UserDemo{age=20, username='jason', wage=1000000}], 22=[UserDemo{age=22, username='yasuo', wage=2000000}, UserDemo{age=22, username='ekko', wage=100}]}

json化觀看觀看更為直觀

{
    20:[
        {
            "age":20,
            "username":"jason",
            "wage":1000000
        }
    ],
    22:[
        {
            "age":22,
            "username":"yasuo",
            "wage":2000000
        },
        {
            "age":22,
            "username":"ekko",
            "wage":100
        }
    ]
}

進階計算 Collectors.summarizingDouble

Map<Integer, DoubleSummaryStatistics> userAvgWageByAge = userDemoList.stream()
                .collect(Collectors.groupingBy(UserDemo::getAge, Collectors.summarizingDouble(s -> s.getWage().doubleValue())));

userAvgWageByAge.forEach((k, v) -> System.out.println(String.format("年齡:%d,平均工資:%f", k, v.getAverage())));

數組快速轉為List

Stream.of(1, 2, 3, 4).collect(Collectors.toList())

結論

後續會學習更多關於Lambda的操作,日積月累...一定會成為一個禿頭的程序猿

Leave a Reply

Your email address will not be published. Required fields are marked *