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());


// List 取对象字段拼接
String collect = DTOList().stream().map(r -> r.getName()).collect(Collectors.joining(","));

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));

10、判断list集合对象中的字段是否存在某个值

if(list.stream()
.filter(item->item.getUserId()
.equals("123456"))
.findAny()
.isPresent())
{
//存在则代码块执行业务逻辑代码
}


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

可以使用Java 8的Stream API和lambda表达式来实现。假设需要比较的属性为"name",示例代码如下: ```java import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { // 假设list的每个map都有一个名为"name"的属性需要比较 List<Map<String, Object>> oldList = new ArrayList<>(); Map<String, Object> map1 = new HashMap<>(); map1.put("name", "Alice"); map1.put("age", 20); oldList.add(map1); Map<String, Object> map2 = new HashMap<>(); map2.put("name", "Bob"); map2.put("age", 25); oldList.add(map2); Map<String, Object> map3 = new HashMap<>(); map3.put("name", "Alice"); map3.put("age", 30); oldList.add(map3); List<Map<String, Object>> newList = oldList.stream() .collect(Collectors.groupingBy(map -> map.get("name"))) .entrySet().stream() .filter(entry -> entry.getValue().size() == 1) .flatMap(entry -> entry.getValue().stream()) .collect(Collectors.toList()); // newList保存的就是所有'name'属性不相同的map System.out.println(newList); } } ``` 输出结果为: ``` [{name=Alice, age=20}, {name=Bob, age=25}] ``` 其,代码的`Collectors.groupingBy`方法可以将listmap按照"name"属性进行分组,得到一个Map,其key为"name"属性的值,value为所有具有该"name"属性的map。然后,`Stream`的`filter`方法可以筛选出所有分组后,只有一个map分组,即所有'name'属性不相同的map所在的分组,最后使用`flatMap`方法将这些map取出,放入一个新的list
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

powerfuler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值