stream流api
基础api
//1.1集合根据某一个属性进行去重
ArrayList<Person> ll = collect.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(Person::getAge))), ArrayList::new));
//集合根据多个属性进行去重
list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() ->
new TreeSet<>(Comparator.comparing(o -> o.getSkuId() + ";" + o.getCode()))), ArrayList::new));
//2.集合根据某一对象**属性进行过滤**
List<Person> collect = Stream.of(new Person("张三", 10), new Person("李四", 12)).filter(
person -> person.getName().equals("张三")).collect(Collectors.toList());
//3.**map对象映射**
List<String> collect1 = Stream.of(new Person("张三", 10), new Person("李四", 12))
.map(Person::getName).collect(Collectors.toList());
//map遍历,如果参数和返回值一样可用peek代替
List<Person> collect1 = Stream.of(new Person("张三", 10), new Person("李四", 12))
.map(data->{data.setName(""); return data}).collect(Collectors.toList());
//4.将list集合按某一属性进行**分组**
Map<String, List<Person>> collect2 =
Stream.of(new Person("张三", 10), new Person("李四", 12),new Person("李四", 31))
.collect(Collectors.groupingBy(Person::getName));
//两层分组
Map<String, Map<String, List<Person>>> areaGroup =
personList.stream().collect(Collectors.groupingBy(Person::getSex,Collectors.groupingBy(Person::getArea)));
//5.将list集合针对**某一属性进行排序**
List<Person> collect3 = Stream.of(new Person("张三", 10), new Person("李四", 12))
.sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
//对数字进行排序
List<Integer> collect4 = Stream.of(1, 2, 5, 3)
.sorted(Comparator.comparing(Integer::new)).collect(Collectors.toList());
//6.获取集合第一个或任意一个
Optional<Integer> findFirst = list.stream().filter(num -> num > 51).findFirst();//findAny
boolean empty = findFirst.isEmpty();
boolean isPresent= findFirst.isPresent();
//判断是否包含
boolean anyMatch = list.stream().anyMatch(num -> num > 6);
//7.Option判空写法
JdCompanyBu jdCompanyBu = Optional.ofNullable(jdCompanyBuPageDTO.getJdCompanyBu())
.orElse(new JdCompanyBu());
//8.并行流
list.parallelStream().filter(l -> l > 6).findAny();
//9.joining拼接字符
String collect = personList.stream().map(Person::getSex).collect(Collectors.joining("-"));
completableFuture线程api
主要有runAsync、supplyAsync、thenCombineAsync、thenComposeAsync、allOf、anyOf
CompletableFuture细节代码链接
(备注:有无Async区别主要在线程池的使用上。有Async会重新指定线程,无沿用上一个)
ExecutorService executor = Executors.newCachedThreadPool();
CompletableFuture.supplyAsync(() -> "hello",executor).thenApply(s -> s + "world").join();
CompletableFuture.runAsync(() -> {System.out.println("123");})
.thenApply(s -> s + "apply").join();
CompletableFuture.supplyAsync(() -> {
ArrayList<Integer> objects = new ArrayList<>();
return objects;
}, executorService).thenCombineAsync(
CompletableFuture.supplyAsync(() -> {
ArrayList<Integer> objects = new ArrayList<>();
return objects;
}), (s1, s2) -> {
s1.addAll(s2);
return s1;
}).join();
CompletableFuture.supplyAsync(() -> 11)
.thenComposeAsync(param -> CompletableFuture.runAsync(() -> System.out.println()));
List<CompletableFuture<List<ShoppingCart>>> list = new ArrayList<>();
CompletableFuture.allOf(list.stream().toArray(CompletableFuture[]::new))
.thenApply(v -> {
List<ShoppingCart> list2 = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
list2.addAll(list.get(i).join());
}
return list2;
}).join();
CompletableFuture.anyOf(futures.toArray(new CompletableFuture[0])).join();
CompletableFuture.runAsync(() -> {}).exceptionally(e -> {throw new RuntimeException();})
Optional
Optional.ofNullable(list).orElse(new ArrayList<>()).stream().forEach(data-> {});
Optional.ofNullable(user).orElseGet( () -> user2);//orElseGet只有在user为空时,才会创建。并且参数是suppiler对象
Optional.ofNullable(billGroupSource.getBillSummaryDetailList()).ifPresent(data-> {});