Java8新特性Lambda表達式的一些常見用法

一、Lamda簡單介紹

Lambda表達式是JAVA8中提供的一種新的特性,它支持Java也能進行簡單的“函數式編程”。

它是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。

要理解函數式編程的產生目的,就要先理解匿名內部類。

先來簡單看下匿名內部類調用方式。

interface Animal {
    void run();
}

public class Main {

    public static void see(Animal animal){
        animal.run();
    }
    public static void main(String[] args) {
        see(new Animal() {
            @Override
            public void run() {
                System.out.println("動物在跑...");
            }
        });
    }
}

Lamda表達式寫法:

interface Animal {
    void run();
}

public class Main {

    public static void see(Animal animal){
        animal.run();
    }
    public static void main(String[] args) {
        see(()->System.out.println("動物在跑..."));
    }
}

是不是挺簡潔,這就是Lamda表達式語言,爲了解決匿名內部類繁雜的操作而出現的。

Lamda語法有三種形式:

(參數) -> 單行語句;
(參數) -> { 多行語句 };
(參數) -> 表達式;
括號()可以大致理解爲就是方法,裏面是參數變量。

 

二、常見用法

1、線程

public class ThreadMain {

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Hello Lamda!");
            }
        }).start();

        // Lamda表達式
        new Thread(()->{
            System.out.println("Hello Lamda!");
        }).start();
    }
}

 

2、過濾及遍歷

創建測試類

public class UserVO {
    private Integer id;
    private String name;
    private Integer balance;

    public UserVO() {
    }

    public UserVO(Integer id, String name, Integer balance) {
        this.id = id;
        this.name = name;
        this.balance = balance;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getBalance() {
        return balance;
    }

    public void setBalance(Integer balance) {
        this.balance = balance;
    }

    @Override
    public String toString() {
        return "UserVO{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", balance=" + balance +
                '}';
    }
}
public class FilterForEachTest{

    public static void main(String[] args) {
        List<UserVO> userVO = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userVO.add(user1);
        userVO.add(user2);
        userVO.add(user3);
        userVO.add(user4);

        // 任意匹配
        boolean b = userVO.stream().anyMatch((u) -> u.getBalance() > 200);
        System.out.println(b);

        // 全匹配
        boolean c = userVO.stream().allMatch((u) -> u.getBalance() > 200);
        System.out.println(c);

        //lamda表達式 過濾及遍歷
        userVO.stream().filter(u -> u.getId() > 1)
                .forEach(u -> System.out.println(u.getId() + "->" + u.getName()));
    }
}

 

3、提取爲Map對象

public class MapTest {
    public static void main(String[] args) {
        List<UserVO> userVO = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userVO.add(user1);
        userVO.add(user2);
        userVO.add(user3);
        userVO.add(user4);

        //提取爲map對象
        Map<Integer, Integer> map = userVO.stream().
                collect(Collectors.toMap(UserVO::getId, UserVO::getBalance, (o, n) -> o));
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "->" + entry.getValue());
        }
    }
}

 

4、對對象裏面某個屬性提取List對象

public class ListTest {

    public static void main(String[] args) {
        List<UserVO> userList = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userList .add(user1);
        userList .add(user2);
        userList .add(user3);
        userList .add(user4);

        // 對對象裏面某個屬性提取List對象
        List<String> list = userList .stream().map(UserVO::getName).collect(Collectors.toList());
        list.stream().forEach(s -> System.out.println(s));
    }
}

 

5、對對象裏某個字段求和

public class SumTest {
    public static void main(String[] args) {
        List<UserVO> userVO = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userVO.add(user1);
        userVO.add(user2);
        userVO.add(user3);
        userVO.add(user4);

        int sum = userVO.stream().mapToInt(obj -> obj.getBalance()).sum();
        System.out.println(sum);

    }

}

 

6、count計數

public class CountTest {
    public static void main(String[] args) {
        List<UserVO> userList = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);

        Map<String, Long> counted = userList.stream()
                .collect(Collectors.groupingBy(u->u.getName(), Collectors.counting()));

        System.out.println(counted);
    }

}

 

7、分組

public class GroupingTest {

    public static void main(String[] args) {
        List<UserVO> userList = new ArrayList<>();
        UserVO user1 = new UserVO(1, "Jason", 200);
        UserVO user2 = new UserVO(2, "Lucy", 200);
        UserVO user3 = new UserVO(3, "Lily", 300);
        UserVO user4 = new UserVO(4, "Lily", 400);
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);

        // 變爲Map<String,List<UserVO>>
        Map<String, List<UserVO>> map = userList.stream()
                .collect(Collectors.groupingBy(UserVO::getName));
        for (Map.Entry<String, List<UserVO>> entry : map.entrySet()) {
            System.out.println(entry.getKey() + "->" + entry.getValue());
        }
    }
}

 

三、總結

以上列出了Lamda表達式的常見用法,Lamda表達式中還有很多其他用法,大家有興趣可以深入瞭解下。

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