Java Stream流解决部分问题
记录一下使用Java Stream流解决部分问题的过程。
- 获取实体类的name属性在nameList集合中的第一个实体类对象。
// 目标nameList
List<String> nameList = new ArrayList<>();
nameList.add("dames");
nameList.add("dames1");
List<TestEntity> list = new ArrayList<>();
list.add(TestEntity.builder().name("dames").build());
list.add(TestEntity.builder().name("dames1").build());
list.add(TestEntity.builder().name("dames2").build());
list.add(TestEntity.builder().name("dames3").build());
// 对象需要用Optional容器接收
Optional<TestEntity> first = list.stream().filter(item -> nameList.contains(item.getName())).findFirst();
- 筛选出map集合中第一个key对应的value,这个key需要满足的是某字符串以它开头。
// 保存k-v映射关系的map
Map<String, String> map = new HashMap<>();
map.put("omada.iot", "iot");
map.put("test", "value2");
map.put("omada", "omada");
// 目标字符串
String prefix = "omada.iot";
// 找到一个符合目标字符串以key开头的对应的value
String firstMatch = map.entrySet().stream()
.filter(entry -> prefix.startsWith(entry.getKey())).findFirst()
// Map.Entry映射为String
.map(Map.Entry::getValue).orElse(null);
- 数据累加。 reduce()方法可以将流元素聚合为单个结果。它接受一个BinaryOperator参数作为累加器。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce(Integer::sum);
- 判断某集合中是否存在某值,该值满足的是某字符串以它开头。
List<String> list1 = new ArrayList<>();
list1.add("omada");
list1.add("iot");
list1.add("test");
String str = "omada.iot";
boolean anyMatch = list1.stream().anyMatch(str::startsWith);
- 分组操作。Collectors.groupingBy,它接受一个分类器函数,根据该函数的结果将元素进行分组,返回一个Map类型的结果,其中键是分类器函数的结果,值是分组的元素集合。
List<String> fruits = Arrays.asList("apple", "banana", "orange", "grape");
Map<Character, List<String>> groupedFruits = fruits.stream()
.collect(Collectors.groupingBy(s -> s.charAt(0)));
// {a=[apple], b=[banana], g=[grape], o=[orange]}
- 分区操作。Collectors.partitioningBy,将流中的元素根据指定的条件进行分区,分区的结果是一个
Map<Boolean, List<T>>
,其中true
对应满足条件的元素集合,false
对应不满足条件的元素集合。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Map<Boolean, List<Integer>> partitionedNumbers = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
// {false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}