zoukankan      html  css  js  c++  java
  • 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":"大王"}]}

  • 相关阅读:
    Spring IOC 容器源码分析
    OAuth协议简介
    MySQL安装步骤
    C# read and compute the code lines number of cs files based on given directory
    C# StreamWriter log batch message sync and async
    HttpClient SendAsync
    WebRequest, WebRequest.Create GetResponse() GetResponseStream()
    C# FileSystemWatcher
    Access Volumn via extern and invoke win 32 dll
    Change file readonly property File.SetAttribute and new FileInfo readonly property
  • 原文地址:https://www.cnblogs.com/kplsm123/p/6812679.html
Copyright © 2011-2022 走看看