package com.ziniao.manage.service; import com.ziniao.manage.pojo.Role; import org.springframework.stereotype.Service; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @Service public class LambdaService { public void lambdaTest(){ //lambda对list的使用 List<Role> roles = new ArrayList<>(); roles.add(new Role(1,"test")); roles.add(new Role(2,"test")); roles.add(new Role(3,"meiri")); roles.add(new Role(3,"meiri")); List<Role> roleList = new ArrayList<>(); roleList.add(new Role(4,"rolea")); roleList.add(new Role(3,"roleb")); List<Role> roleList1 = new ArrayList<>(); roleList1.add(new Role(1.1,2.2f)); roleList1.add(new Role(1.2,2.3f)); /** * for循环的使用 */ roles.forEach(role -> { roleList.forEach(role1 ->{ if(role.getId().equals(role1.getId())){ //System.out.println(role.getId()); } } ); }); /** * distinct中去重的使用 */ //这个不起作用why??? List<Role> listRole = roles.stream().distinct().collect(Collectors.toList()); System.out.println(); /** * 对象中某个值的去重 * 这里有个问题就是为null的时候会会报错 */ List<Role> roleListByKey = roles.stream().filter(LambdaService.distinctByKey(Role::getRoleName)).collect(Collectors.toList()); System.out.println(); /** *直接跳过skip()直接查看skip的后面list//这个在实际应用上应该很少 */ List<Role> skipRoleList = roles.stream().skip(2).collect(Collectors.toList()); System.out.println(); /** * 排序sort(正序r1,r2顺序一样,倒叙相反) * 比较最好用compare来用这样基本类型都可以用,-号的话只能是Long,Integer,int 整数 */ List<Role> sortRoleList = roleList.stream().sorted((r1,r2)->r2.getId().compareTo(r1.getId())).collect(Collectors.toList()); //这里还有个简写的方式 roleList.sort((r1,r2)->r2.getId().compareTo(r1.getId())); List<Role> sortRoleList1 = roleList.stream().sorted((r1,r2)->r1.getRoleName().compareTo(r2.getRoleName())).collect(Collectors.toList()); List<Role> sortRoleList2 = roleList1.stream().sorted((r1,r2)->r2.getTest2().compareTo(r1.getTest2())).collect(Collectors.toList()); System.out.println(); /** * 过滤filter */ //这个是过滤某个类型中的值这个会很好用点 List<Role> filterRoleList = roleList.stream().filter(role ->role.getId()>3 && role.getRoleName().equals("test")).collect(Collectors.toList()); //这个null也可以 List<Role> filterRoleList2 = roleList1.stream().filter(role ->role.getTest1()==null).collect(Collectors.toList()); System.out.println(); /** * 直接获取list中的某个属性的值map(->/::get)都可(这个我用的还比较多) */ List<Integer> mapIdList = roleList.stream().map(item -> item.getId()).collect(Collectors.toList()); List<String> mapIdList1 = roleList.stream().map(Role::getRoleName).collect(Collectors.toList()); /** * 具体某个属性的.sum(),average(),max()先列这么多//这里点就是.average 等获取到的是Optional+基本类型这种数据类型 */ long count = roleList.stream().count(); Integer sumInt = roleList.stream().mapToInt(Role::getId).sum(); Double sumDouble = roleList1.stream().mapToDouble(Role::getTest1).sum(); Double avageDouble = roleList1.stream().mapToDouble(Role::getTest1).average().getAsDouble(); Double minDouble = roleList1.stream().mapToDouble(Role::getTest1).min().getAsDouble(); Double maxDouble = roleList1.stream().mapToDouble(Role::getTest1).max().getAsDouble(); //用规约的方式 reduce Optional<Integer> reduceSum = roleList.stream().map(role -> role.getId()).reduce(Integer::sum);//没有初始值返回的值为Optional<> Integer reduceSums = roleList.stream().map(role -> role.getId()).reduce(0,Integer::sum);//这里有个初始值 Integer a = reduceSum.get(); System.out.println(); /** * 对某个属性值直接拼接字符串输出(这里int还不能直接用) */ String str = roleList.stream().map(Role::getRoleName).collect(Collectors.joining(", ")); /** * 分组Collectors.groupingBy(属性名) */ Map<Integer,List<Role>> groupRoleList = roles.stream().collect(Collectors.groupingBy(Role::getId)); /** * 多重分组(Collectors.groupingBy(属性名),Collectors.groupingBy(属性名)) */ Map<String,Map<Integer,List<Role>>> mutilGroupRoleList =roles.stream().collect(Collectors.groupingBy(Role::getRoleName,Collectors.groupingBy(Role::getId))); System.out.println(); List<Long> longs = new ArrayList<>(); longs.add(1L); longs.add(2L); longs.add(1L); List<Long> longList = longs.stream().distinct().collect(Collectors.toList()); System.out.println(); } public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) { Map<Object, Boolean> seen = new ConcurrentHashMap<>(); return object ->seen.putIfAbsent(keyExtractor.apply(object), true) == null; } }
