一、流的创建
链接:https://blog.csdn.net/qq_33429968/article/details/76380499
提示:由数组创建、由文件创建、由函数生成 要多加练习
二、Stream重用
Supplier<Stream<String>> streamSupplier = () -> Stream.of("d2", "a2", "b1", "b3", "c") .filter(s -> s.startsWith("a")); streamSupplier.get().anyMatch(s -> true); // ok streamSupplier.get().noneMatch(s -> true); // ok
通过Supplier来包装流,达到重用的目的
三、Java Colletion按对象属性分组、分组汇总等操作示例
import lombok.Data; import lombok.experimental.Accessors; @Data @Accessors(chain = true) public class PersonData { private String id; private String type; private String name; private int age; }
对象PersonData使用了Lombook的@Data和@Accessors注解。
public static void main(String[] args) { List<PersonData> list = new ArrayList<PersonData>(); PersonData p1 = new PersonData().setId("1").setName("张三").setType("管理员").setAge(20); PersonData p2 = new PersonData().setId("2").setName("李四").setType("管理员").setAge(30); PersonData p3 = new PersonData().setId("3").setName("王五").setType("用户").setAge(40); PersonData p4 = new PersonData().setId("4").setName("马六").setType("访客").setAge(50); list.add(p1); list.add(p2); list.add(p3); list.add(p4); //跟据某个属性分组 Map<String, List<PersonData>> collect = list.stream().collect(Collectors.groupingBy(PersonData::getType)); System.out.println(collect); //根据某个属性分组,汇总某个属性 Map<String, Integer> collect2 = list.stream().collect(Collectors.groupingBy(PersonData::getType, Collectors.summingInt(PersonData::getAge))); System.out.println(collect2); //判断一组对象里面有没有属性值是某个值 boolean add = list.stream().anyMatch(m -> "王五".equals(m.getName())); System.out.println(add); //取出一组对象的某个属性组成一个新集合(转化) List<String> names = list.stream().map(PersonData::getName).collect(Collectors.toList()); System.out.println(names); }
结果输出(JDK14):
{用户=[PersonData(id=3, type=用户, name=王五, age=40)], 访客=[PersonData(id=4, type=访客, name=马六, age=50)], 管理员=[PersonData(id=1, type=管理员, name=张三, age=20), PersonData(id=2, type=管理员, name=李四, age=30)]}
{用户=40, 访客=50, 管理员=50}
true
[张三, 李四, 王五]
四、利用Stream API合并Map中的元素
// 利用Collectors.toMap()实现Map合并功能 Map<String, Employee> map3 = Stream.of(map1, map2) .flatMap(map -> map.entrySet().stream()) .collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> new Employee(v1.getId(), v2.getName())));
// flatMap,返回(1, 8)(2, 7)(3, 6)(4, 8)(5, 7) List<Integer> numbers1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> numbers2 = Arrays.asList(6, 7, 8); List<int[]> pairs = numbers1.stream() .flatMap((Integer i) -> numbers2.stream().map((Integer j) -> new int[]{i, j})) .filter(pair -> (pair[0] + pair[1]) % 3 == 0) .collect(toList());
五、takewhile和dropwhile(Java9)
List<Dish> specialMenu = Arrays.asList( new Dish("seasonal fruit", true, 120, Dish.Type.OTHER), new Dish("prawns", false, 300, Dish.Type.FISH), new Dish("rice", true, 350, Dish.Type.OTHER), new Dish("chicken", false, 400, Dish.Type.MEAT), new Dish("french fries", true, 530, Dish.Type.OTHER)); // takewhile 发现第一个结果为false的元素时停止处理,并返回之前的所有元素 List<Dish> slicedMenu1 = specialMenu.stream().takeWhile(dish -> dish.getCalories() < 320).collect(toList()); // 返回"seasonal fruit"和"prawns" // dropwhile 发现第一个结果为false的元素时停止处理,并返回之后的所有元素 List<Dish> slicedMenu2 = specialMenu.stream().dropWhile(dish -> dish.getCalories() < 320).collect(toList()); // 返回"rice"、"chicken"和"french fries"