java8 filter代码报错_Java8新特性(lambda表达式):List分组、List转Map、String转List、mapKey转list、循环map、过滤Filter、List转Str...

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

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

1、分组

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

//List 以名称分组 Map>

public static void testGroupBy1(Listusers) {

Map> groupByMap = users.stream().collect(Collectors.groupingBy(User::getName));

for (Map.Entry> 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>

public static void testGroupBy2(Listusers) {

Map> groupByMap = users.stream().collect(Collectors.groupingBy(b -> b.getAge()));

for (Map.Entry> 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(Listusers) {

Mapmaps = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));

for (Map.Entryentry : 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(Listusers) {

Mapmaps = users.stream().collect(Collectors.toMap(User::getName, a -> a,(k1,k2)->k1));

for (Map.Entryentry : 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(Listusers) {

ListfilterList = 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(Listusers) {

ListfilterList = 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、查找流中最大 最小值

OptionalmaxDish = users.stream().

collect(Collectors.maxBy(Comparator.comparing(User::getAge)));

maxDish.ifPresent(System.out::println);

OptionalminDish = users.stream().

collect(Collectors.minBy(Comparator.comparing(User::getAge)));

minDish.ifPresent(System.out::println);

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

String tenantIds = “1,2,3,4,5,6”;

ListlistIds = Arrays.asList(tenantIds.split(",")).stream().map(s -> Long.parseLong(s)).collect(Collectors.toList());

7、测试Map转List

Mapmaps = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));

ListuserList = maps.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList());

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

ListuserIds = users.stream().map(user -> user.getId()).collect(Collectors.toList());

// 以,间隔把List转成String

Joiner.on(",").join(userIds);

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

Setset = new HashSet<>(listA);

set.addAll(listB);

ListlistAll = new ArrayList();

listAll.addAll(list1);

listAll.addAll(list2);

listAll = new ArrayList(new LinkedHashSet<>(listAll));

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用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`方法可以将list中的map按照"name"属性进行分组,得到一个Map,其中key为"name"属性的值,value为所有具有该"name"属性的map。然后,`Stream`的`filter`方法可以筛选出所有分组后,只有一个map分组,即所有'name'属性不相同的map所在的分组,最后使用`flatMap`方法将这些map取出,放入一个list中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值