欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中Lambda表达式的简单使用

程序员文章站 2022-06-14 23:42:19
Lambda表达式是Java SE 8中一个重要的新特性。你可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 Lambda运算符:所有的Lambda表达式都是用新的Lam ......

  Lambda表达式是Java SE 8中一个重要的新特性。你可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

  Lambda运算符:所有的Lambda表达式都是用新的Lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是Lambda的主体。

  在平常 我们可以要通过sql  对数据进行过滤、分组、转化等,如果非常频繁,会对数据库增加负担,我们这里就可以简单使用Lambda表达式

1、准备一个Object类

import java.math.BigDecimal;

public class AObject {

    private String a;
    
    private String b;
    
    private BigDecimal money;
    
    private Integer num;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }
    
    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    @Override
    public String toString(){
        return a+" "+b;
    }
    
    
}

2、Lambda使用

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

public class StreamUtils {
    
    public static void main(String args[]){
        listToMap();
        filter();
//        groupingBy();
//        sum();
        
    }

    /**
     * List<T> -> Map
     * 需要注意的是:
     * toMap 如果集合对象有重复的key,会报错Duplicate key ....
     *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
     */
    public static void listToMap() {
        List<AObject> aList = new ArrayList<>();
        AObject aObject = new AObject();
        aObject.setA("a");
        aObject.setB("B");
        AObject aObject1 = new AObject();
        aObject1.setA("a1");
        aObject1.setB("B1");
        aList.add(aObject);
        aList.add(aObject1);
        
        Map<String, AObject> map = aList.stream().
                collect(Collectors.toMap(AObject::getA, AObject->AObject,(k1,k2)->k1));
        for(Map.Entry<String, AObject> entry : map.entrySet()){
            System.out.println("key:"+entry.getKey()+"  value:"+entry.getValue().toString());
        }
//        key:a1  value:a1 B1
//        key:a  value:a B
        
        Map<String, String> map1 = aList.stream().
                collect(Collectors.toMap(AObject::getA, AObject::getB,(k1,k2)->k1));
        for(Map.Entry<String, String> entry : map1.entrySet()){
            System.out.println("key:"+entry.getKey()+"  value:"+entry.getValue());
        }
//        key:a1  value:B1
//        key:a  value:B
        
    }
    
    /**
     * 过滤
     */
    public static void filter() {
        List<String> aList = new ArrayList<>();
        aList.add("1");
        aList.add("a");
        List<String> slist =aList.stream().filter(e -> "a".equals(e)).collect(Collectors.toList());
        System.out.println(slist.toString());//        [a]
                
        
        List<AObject> list = new ArrayList<>();
        AObject aObject = new AObject();
        aObject.setA("110000");
        aObject.setB("北京");
        AObject aObject2 = new AObject();
        aObject2.setA("330000");
        aObject2.setB("浙江");
        list.add(aObject);
        list.add(aObject2);
        List<AObject> newList =list.stream().filter(e -> e.getA().equals("110000")).collect(Collectors.toList());
        System.out.println(newList.toString());//        [110000 北京]
    }
    
    /**
     * 分组
     */
    public static void groupingBy(){
        List<AObject> list = new ArrayList<>();
        AObject aObject = new AObject();
        aObject.setA("110000");
        aObject.setB("北京");
        AObject aObject1 = new AObject();
        aObject1.setA("110000");
        aObject1.setB("北京1");
        AObject aObject2 = new AObject();
        aObject2.setA("330000");
        aObject2.setB("浙江");
        AObject aObject3 = new AObject();
        aObject3.setA("330000");
        aObject3.setB("浙江1");
        list.add(aObject);
        list.add(aObject1);
        list.add(aObject2);
        list.add(aObject3);
        //groupingBy  只传key 默认把整个集合关联,  也可以把集合某个数据属性 当做集合取出来,如下groupBy1
        Map<String, List<AObject>> groupBy = list.stream().collect(Collectors.groupingBy(AObject::getA));
        for(Map.Entry<String, List<AObject>> item : groupBy.entrySet()){
            System.out.print(item.getKey()+" : ");
            for(AObject a : item.getValue()){
                System.out.print(a.toString()+";");
            }
            System.out.println();
        }
        //110000 : 110000 北京;110000 北京1;
        //330000 : 330000 浙江;330000 浙江1;
        
        Map<String, List<String>> groupBy1 = list.stream().collect(
                Collectors.groupingBy(AObject::getA, Collectors.mapping(AObject::getB, Collectors.toList())));
        for(Map.Entry<String, List<String>> item : groupBy1.entrySet()){
            System.out.print(item.getKey()+" : ");
            for(String a : item.getValue()){
                System.out.print(a+";");
            }
            System.out.println();
        }
//        110000 : 北京;北京1;
//        330000 : 浙江;浙江1;
    }
    
    /**
     * 求和
     */
    public static void sum(){
        List<AObject> list = new ArrayList<>();
        AObject aObject = new AObject();
        aObject.setMoney(new BigDecimal("100"));
        aObject.setNum(100);
        AObject aObject1 = new AObject();
        aObject1.setMoney(new BigDecimal("200"));
        aObject1.setNum(200);
        AObject aObject2 = new AObject();
        aObject2.setMoney(new BigDecimal("300"));
        aObject2.setNum(300);
        AObject aObject3 = new AObject();
        aObject3.setMoney(new BigDecimal("400"));
        aObject3.setNum(400);
        list.add(aObject);
        list.add(aObject1);
        list.add(aObject2);
        list.add(aObject3);
        //注意的是  求和的属性 值不能为null
        BigDecimal totalMoney = list.stream().map(AObject::getMoney).
                reduce(BigDecimal.ZERO, BigDecimal::add);
        System.out.println("totalMoney:"+totalMoney); // totalMoney:1000
        Integer totalMoney1 = list.stream().map(AObject::getNum).
                reduce(0, Integer::sum);
        System.out.println("totalSum:"+totalMoney1); // totalSum:1000
        int sum = list.stream().mapToInt(AObject::getNum).sum();
        System.out.println("sum:"+sum);// sum:1000
    }
    
    
}