Java8新特性(lambda表达式):List分组、List转Map、String转List、mapKey转list、循环map、过滤Filter、List转String

利用java8新特性,可以用简洁高效的代码来实现一些数据处理

List分组、List转Map、String转List、mapKey转list、循环map、过滤Filter、List转String

 

1、分组
List里面的对象元素,以某个属性来分组,将属性相同的放在一起:

//List 以名称分组 Map<String, List<User>>
public static void testGroupBy1(List<User> users) {
    Map<String, List<User>> groupByMap = users.stream().collect(Collectors.groupingBy(User::getName));
    for (Map.Entry<String, List<User>> entry : groupByMap.entrySet()) {
        System.out.println("分组对应的key:"+ entry.getKey() +";对应的value:"+ entry.getValue() +";");
    }
    //        分组对应的key:lisi;对应的value:[User{id=2, name='lisi', age=19, grade=50.0}];
    //        分组对应的key:zhangsan;对应的value:[User{id=1, name='zhangsan', age=20, grade=60.0}, User{id=5, name='zhangsan', age=20, grade=70.0}];
    //        分组对应的key:wangwu;对应的value:[User{id=3, name='wangwu', age=20, grade=60.0}, User{id=4, name='wangwu', age=20, grade=70.0}];
}

//List 以名称年龄 Map<Integer, List<User>>
public static void testGroupBy2(List<User> users) {
    Map<Integer,List<User>> groupByMap = users.stream().collect(Collectors.groupingBy(b -> b.getAge()));
    for (Map.Entry<Integer, List<User>> entry : groupByMap.entrySet()) {
        System.out.println("分组对应的key:"+ entry.getKey() +";对应的value:"+ entry.getValue() +";");
    }
    //        分组对应的key:19;对应的value:[User{id=2, name='lisi', age=19, grade=50.0}];
    //        分组对应的key:20;对应的value:[User{id=1, name='zhangsan', age=20, grade=60.0}, User{id=3, name='wangwu', age=20, grade=60.0}, User{id=4, name='wangwu', age=20, grade=70.0}, User{id=5, name='zhangsan', age=20, grade=70.0}];
}    

2、List转Map

id为key(不重复),apple对象为value,可以这么做:

public static void testList2Map1(List<User> users) {
    Map<Long, User> maps = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
    for (Map.Entry<Long, User> entry : maps.entrySet()) {
        System.out.println("分组对应的key:"+ entry.getKey() +";对应的value:"+ entry.getValue() +";");
    }
    //        分组对应的key:1;对应的value:User{id=1, name='zhangsan', age=20, grade=60.0};
    //        分组对应的key:2;对应的value:User{id=2, name='lisi', age=19, grade=50.0};
    //        分组对应的key:3;对应的value:User{id=3, name='wangwu', age=20, grade=60.0};
    //        分组对应的key:4;对应的value:User{id=4, name='wangwu', age=20, grade=70.0};
    //        分组对应的key:5;对应的value:User{id=5, name='zhangsan', age=20, grade=70.0};
}


/**
 * List -> Map
 * 需要注意的是:
 * toMap 如果集合对象有重复的key,会报错Duplicate key ....
 *  apple1,apple12的id都为1。
 *  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
 */

public static void testList2Map2(List<User> users) {
    Map<String, User> maps = users.stream().collect(Collectors.toMap(User::getName, a -> a,(k1,k2)->k1));
    for (Map.Entry<String, User> entry : maps.entrySet()) {
        System.out.println("分组对应的key:"+ entry.getKey() +";对应的value:"+ entry.getValue() +";");
    }
    //        分组对应的key:lisi;对应的value:User{id=2, name='lisi', age=19, grade=50.0};
    //        分组对应的key:zhangsan;对应的value:User{id=1, name='zhangsan', age=20, grade=60.0};
    //        分组对应的key:wangwu;对应的value:User{id=3, name='wangwu', age=20, grade=60.0};
}

3、过滤Filter、从集合中过滤出来符合条件的元素:

public static void testFilter(List<User> users) {
    List<User> filterList = users.stream().filter(a -> a.getName().equals("zhangsan")).collect(Collectors.toList());
    for(User filter : filterList){
        System.out.println("过滤出来的集合:"+filter);
    }
    //        过滤出来的集合:User{id=1, name='zhangsan', age=20, grade=60.0}
    //        过滤出来的集合:User{id=5, name='zhangsan', age=20, grade=70.0}
}

4.过滤统计求和、将集合中的数据按照某个属性求和:

//计算张三总分
public static void testSum(List<User> users) {
    List<User> filterList = users.stream().filter(a -> a.getName().equals("zhangsan")).collect(Collectors.toList());
    Double gradeSum = filterList.stream().map(User::getGrade).reduce((result, item) -> result + item).get();
    System.out.println("总和:"+gradeSum);

    // BigDecimal 类型的求和
    /*BigDecimal amount = list.stream()
            // 将对象的mongey取出来map为Bigdecimal
            .map(b -> b.getAmount())
            // 使用reduce聚合函数,实现累加器
            .reduce(BigDecimal.ZERO, BigDecimal::add);*/
}


    List list= users.stream()
            .filter(b -> "zhangsan".equals(b.getName()))
            //.filter(b -> b.getGrade() == 60 )
            .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(b -> b.getId()))), ArrayList::new));
//        过滤name等于zhangsan,
//        去重->将过滤后的转set,key为id(set集合key不能重复)->在转为ArrayList


5、查找流中最大 最小值    

Optional<User> maxDish = users.stream().
            collect(Collectors.maxBy(Comparator.comparing(User::getAge)));
    maxDish.ifPresent(System.out::println);

    Optional<User> minDish = users.stream().
            collect(Collectors.minBy(Comparator.comparing(User::getAge)));
    minDish.ifPresent(System.out::println);


6、字符串分隔,并转为Long型集合:

String tenantIds = “1,2,3,4,5,6”;
List<Long> listIds = Arrays.asList(tenantIds.split(",")).stream().map(s -> Long.parseLong(s)).collect(Collectors.toList());

7、测试Map转List

    Map<Long, User> maps = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
    List<User> userList = maps.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList());

8、 List 对象取里面的字段转list数组,以,间隔把List转成String

    List<Long> userIds = users.stream().map(user -> user.getId()).collect(Collectors.toList());
    // 以,间隔把List转成String
    Joiner.on(",").join(userIds);

9、两个、多个List合并成一个List并去重

Set<String> set = new HashSet<>(listA);
set.addAll(listB);

List<Integer> listAll = new ArrayList<Integer>();
listAll.addAll(list1);
listAll.addAll(list2);
listAll = new ArrayList<Integer>(new LinkedHashSet<>(listAll));


   每天努力一点,每天都在进步

©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页