Java8 Lambda 表達式學習

Java8新特性

今天不是很忙,抽空看了學習一下lambda表達式,假如我們有一個需求:需要給一個學生的集合按照年齡排序.傳統的實現如下:
MODEL	類
完成排序
Collections 是java.util包下的一個工具類,主要用來做一些集合的操作,大家有時間可以看一下,傳統的實現要override Comparator接口下的compare方法.

java8的Lambda表達式可以簡化掉實現部分的代碼,如以上的需求,用lambda只要一行就好,代碼如下:
在這裏插入圖片描述
Java8有很多新特性:

Lambda 表達式 − Lambda 允許把函數作爲一個方法的參數(函數作爲參數傳遞到方法中)。

方法引用 − 方法引用提供了非常有用的語法,可以直接引用已有Java類或對象(實例)的方法或構造器。與lambda聯合使用,方法引用可以使語言的構造更緊湊簡潔,減少冗餘代碼。

默認方法 − 默認方法就是一個在接口裏面有了一個實現的方法。

Stream API −新添加的Stream API(java.util.stream) 把真正的函數式編程風格引入到Java中。

Date Time API − 加強對日期與時間的處理。

Optional 類 − Optional 類已經成爲 Java 8 類庫的一部分,用來解決空指針異常。

其中最核心的就是函數式編程和Stream流了,下面結合實例來看一下,還是剛纔的學生類,我們加上幾個屬性:
在這裏插入圖片描述
下面是加上過濾條件,輸出成績在85分以上的學生:
在這裏插入圖片描述
這裏出現了stream流的API,它包含了大量的封裝好的接口供我們使用,掌握了stream流,基本就對lambda掌握了一半,下面來試一下用stream流進行分組操作,還是剛纔的學生類,我們再加一個班級屬性:
在這裏插入圖片描述
這裏用Map用key代表A或B,value即使屬於這兩個班級的學生,那麼Lambda中,List和Map之間的轉換是怎麼樣的,如下:
在這裏插入圖片描述
如圖,Map的key 就是學生名稱,value則是一個學生的主體,剛纔也看了List在Lambda下的過濾操作,接下來分別看一下根據map的key和value的過濾操作:
在這裏插入圖片描述
Optional是一個容許空對象的容器類,在這個容器中對象如果存在的話,就可以通過get()方法獲取到,否則返回一個空的Optional對象:
在這裏插入圖片描述
進行到這裏差不多了,下面搞一個lambda的集中訓練的代碼,基本常用的功能包含在裏面:

package com.lambda.test;

import com.lambda.model.Employee;
import org.junit.Test;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @program: study
 * @description:
 * @author: Elias.Guo
 * @create: 2020-06-08 15:25
 **/
public class LambdaTest4 {
    public static List<Employee> generateData() {
        return Arrays.asList(new Employee("Matt", 5000, "New York"),
                new Employee("Steve", 6000, "London"),
                new Employee("Carrie", 10000, "New York"),
                new Employee("Peter", 7000, "New York"),
                new Employee("Alec", 6000, "London"),
                new Employee("Sarah", 8000, "London"),
                new Employee("Rebecca", 4000, "New York"),
                new Employee("Pat", 20000, "New York"),
                new Employee("Tammy", 9000, "New York"),
                new Employee("Fred", 15000, "Tokyo"));
    }
    public static Map<String, Integer> generateMapData() {
        Map<String, Integer> items = new HashMap<>();
        items.put("A", 10);
        items.put("B", 20);
        items.put("C", 30);
        items.put("D", 40);
        items.put("E", 50);
        items.put("F", 60);

        return items;
    }
    @Test
    public void test1(){
//anyMatch
        List<Employee> employeeList = generateData();
        boolean isMatch = employeeList.stream().anyMatch(employee -> employee.getOffice().equals("London"));
        System.out.println(isMatch);

        //allMatch
        boolean matched = employeeList.stream().allMatch(employee -> employee.getOffice().equals("London"));
        System.out.println(matched);

        //找出工資最高的
        Optional<Employee> employeeOptional = employeeList.stream().max((e1, e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
        System.out.println(employeeOptional);

        //找出工資最少的
        Optional<Employee> employee = employeeList.stream().min((e1,e2)->Integer.compare(e1.getSalary(),e2.getSalary()));
        System.out.println(employee);

        //返回姓名列表
        List<String> names = employeeList.stream().map(c->c.getName()).collect(Collectors.toList());
        System.out.println(names);

        System.out.println(">>>>>>>>>>>");
        //List轉化Map
        Map<String,Employee> employeeMap = employeeList.stream().collect(Collectors.toMap((key->key.getName()),(value->value)));
        employeeMap.forEach((key,value)-> System.out.println(key + "=" + value));

        //統計辦公室是New York的個數
        long officeCount =  employeeList.stream().filter(c->c.getOffice().equals("New York")).count();
        System.out.println(officeCount);

        long salaryCount = employeeList.stream().filter(c->c.getSalary()>60000).count();
        System.out.println(salaryCount);

        //List轉化爲Set
        Set<String> officeSet = employeeList.stream().map(c->c.getOffice()).distinct().collect(Collectors.toSet());
        System.out.println(officeSet);

        Set<Integer> salarySet = employeeList.stream().map(c->c.getSalary()).distinct().collect(Collectors.toSet());
        System.out.println(salarySet);

        //查找辦公室地點是New York的員工
        Optional<Employee> optionals = employeeList.stream().filter(c->c.getOffice().equals("New York")).findAny();
        System.out.println(optionals);

        System.out.println(">>>>>工資降序排序>>>>>");
        //按照工資的降序來列出員工信息
        List<Employee> sortSalaryEmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).collect(Collectors.toList());
        System.out.println(sortSalaryEmployeeList);

        System.out.println(">>>>>姓名升序排序>>>>>");
        List<Employee> sortNameEmployeeList = employeeList.stream().sorted((e1,e2)->e1.getName().compareTo(e2.getName())).collect(Collectors.toList());
        System.out.println(sortNameEmployeeList);

        System.out.println(">>>>獲取工資最高的前2條員工信息");
        List<Employee> dispaly2EmployeeList = employeeList.stream().sorted((e1,e2)->Integer.compare(e2.getSalary(),e1.getSalary())).limit(2).collect(Collectors.toList());
        System.out.println(dispaly2EmployeeList);

        System.out.println(">>>>獲取平均工資");
        OptionalDouble averageSalary = employeeList.stream().mapToInt(c->c.getSalary()).average();
        System.out.println(averageSalary);

        System.out.println(">>>>獲取工作地點的平均工資");
        OptionalDouble optionalDouble = employeeList.stream().filter(c->c.getOffice().equals("New York")).mapToInt(c->c.getSalary()).average();
        System.out.println(optionalDouble);

        System.out.println(">>>>>>Java8 Optional用法>>>>>>");
        Optional<String> stringOptional = Optional.of("test");
        System.out.println(stringOptional.get());

        Optional<String> isOptional = Optional.ofNullable("hello");
        System.out.println(isOptional.isPresent());
        System.out.println(isOptional.get());
        System.out.println(isOptional.orElse("0"));

        System.out.println(">>>>>>>>>>>>");
        //Optional<String> optionalVal = Optional.of(null);
        // System.out.println(optionalVal);
        Optional<String> optional = Optional.ofNullable("optional");
        System.out.println(optional);
        System.out.println(optional.isPresent());
        System.out.println(optional.get());
        System.out.println(optional.orElse("haha"));
        System.out.println(">>>>>>>>>>>>");

        Optional<Employee> employeeOptional_ = employeeList.stream().filter(c->c.getOffice().equals("New York")).findFirst();
        System.out.println(employeeOptional_);

    }


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章