Lambda表达式 Lambda expression(1)

Lambda表达式概念

Lambda 表达式 百度百科:

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

lambda expression  Wikipedia:

lambda expression in computer programming, also called anonymous function, a function (or a subroutine) defined, and possibly called, without being bound to an identifier

Lambda 表达式在计算机编程中也被称为匿名函数,即一个不用绑定指定标识符,但可以被调用的函数。

也就是说,Java中的Lambda表达式和Java中的匿名类是一样的,可以实现同样的功能。

Lambda表达式简化代码,提高开发效率,常和Stream联用。

Lambda表达式简单样例:

普通Java代码如:

 1 @Test
 2     public void test0() {
 3         List<String> list = new ArrayList<>();
 4         list.add("a9");
 5         list.add("a0");
 6         list.add("a7");
 7         list.add("a1");
 8         Collections.sort(list, new Comparator<String>() {
 9 
10             @Override
11             public int compare(String o1, String o2) {
12                 return o1.compareTo(o2);
13             }
14             
15         });
16         System.out.println(list);
17     }

output:[a0, a1, a7, a9].

Lambda 表达式代码如:

 1 @Test
 2     public void test1() {
 3         List<String> list = new ArrayList<>();
 4         list.add("a9");
 5         list.add("a0");
 6         list.add("a7");
 7         list.add("a1");
 8         Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
 9         System.out.println(list);
10     }

output:[a0, a1, a7, a9].

可见,Lambda表达式实现了匿名类的功能,并且较之更加简洁。

 

Lambda表达式与Stream联合使用:

Demo:

过滤map中值为1的键值对:

        HashMap<String, Integer> obj = new HashMap<>();
        obj.put("A", 1);
        obj.put("B", 0);
        obj.put("C", 0);
        obj.put("D", 1);
        Map<String, Integer> result = obj.entrySet().stream().filter(en -> (Integer) en.getValue() == 1)
                .collect(Collectors.toMap(Entry<String, Integer>::getKey, Entry<String, Integer>::getValue));

按单个条件分组 group:

package com.x.project.lambda;

import com.alibaba.fastjson.JSON;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Group {

    @Test
    public void multiConditionGroup() {
        People a = new People();
        a.setName("小王");
        a.setIdCardNum("a");
        a.setHobby("吃鸡");
        a.setAddr("1");

        People b = new People();
        b.setName("大王");
        b.setIdCardNum("b");
        b.setHobby("吃鸭");
        b.setAddr("1");

        People c = new People();
        c.setName("老王");
        c.setIdCardNum("c");
        c.setHobby("吃鱼");
        c.setAddr("2");

        People d = new People();
        d.setName("王王");

        d.setIdCardNum("d");
        d.setHobby("吃肉");
        d.setAddr("2");

        Map<String, List<People>> collect = Arrays.asList(a, b, c, d).stream().collect(Collectors.groupingBy(People::getHobby));
        System.out.println(JSON.toJSONString(collect));
    }
}

class People {

    String name;

    String idCardNum;

    String phone;

    String bankCardNum;

    String hobby;

    String addr;


    public String getName() {
        return name;
    }

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

    public String getIdCardNum() {
        return idCardNum;
    }

    public void setIdCardNum(String idCardNum) {
        this.idCardNum = idCardNum;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getBankCardNum() {
        return bankCardNum;
    }

    public void setBankCardNum(String bankCardNum) {
        this.bankCardNum = bankCardNum;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }


}
View Code

output:{"吃鸭":[{"addr":"1","hobby":"吃鸭","idCardNum":"b","name":"大王"}],"吃鱼":[{"addr":"2","hobby":"吃鱼","idCardNum":"c","name":"老王"}],"吃鸡":[{"addr":"1","hobby":"吃鸡","idCardNum":"a","name":"小王"}],"吃肉":[{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}]}

根据hobby分成了四组,每组一个元素,如果我们将People a 的hobby 设为"吃鱼",那么我们将会得到:

output:{"吃鸭":[{"addr":"1","hobby":"吃鸭","idCardNum":"b","name":"大王"}],"吃鱼":[{"addr":"1","hobby":"吃鱼","idCardNum":"a","name":"小王"},{"addr":"2","hobby":"吃鱼","idCardNum":"c","name":"老王"}],"吃肉":[{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}]}

现在分成了三组

  

按组合条件分组:

package com.x.project.lambda;

import com.alibaba.fastjson.JSON;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

public class Group {
    
    @Test
    public void multiConditionGroup() {
        People a = new People();
        a.setName("小王");
        a.setIdCardNum("a");
        a.setHobby("吃鱼");
        a.setAddr("1");

        People b = new People();
        b.setName("大王");
        b.setIdCardNum("b");
        b.setHobby("吃鱼");
        b.setAddr("1");

        People c = new People();
        c.setName("老王");
        c.setIdCardNum("c");
        c.setHobby("吃肉");
        c.setAddr("2");

        People d = new People();
        d.setName("王王");
        d.setIdCardNum("d");
        d.setHobby("吃肉");
        d.setAddr("2");

        Map<People, List<People>> collect = Arrays.asList(a, b, c, d).stream().collect(Collectors.groupingBy(People::hobbyAddr));
        System.out.println(JSON.toJSONString(collect));
    }
}

class People {

    String name;

    String idCardNum;

    String phone;

    String bankCardNum;

    String hobby;

    String addr;


    public String getName() {
        return name;
    }

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

    public String getIdCardNum() {
        return idCardNum;
    }

    public void setIdCardNum(String idCardNum) {
        this.idCardNum = idCardNum;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getBankCardNum() {
        return bankCardNum;
    }

    public void setBankCardNum(String bankCardNum) {
        this.bankCardNum = bankCardNum;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public People hobbyAddr(){
        return new People(hobby,addr);
    }

    public People() {
    }

    public People(String hobby, String addr) {
        this.hobby = hobby;
        this.addr = addr;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof People)) return false;
        People people = (People) o;
        return Objects.equals(getHobby(), people.getHobby()) &&
                Objects.equals(getAddr(), people.getAddr());
    }

    @Override
    public int hashCode() {

        return Objects.hash(getHobby(), getAddr());
    }
}
View Code

如代码:需要添加一个关于相应条件的方法,另加关于相应条件的equals方法,

output:{{"addr":"2","hobby":"吃肉"}:[{"addr":"2","hobby":"吃肉","idCardNum":"c","name":"老王"},{"addr":"2","hobby":"吃肉","idCardNum":"d","name":"王王"}],{"addr":"1","hobby":"吃鱼"}:[{"addr":"1","hobby":"吃鱼","idCardNum":"a","name":"小王"},{"addr":"1","hobby":"吃鱼","idCardNum":"b","name":"大王"}]}

原文地址:https://www.cnblogs.com/kplsm123/p/6812679.html