package com.pigg.study.tree.common.stream;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.*;
public class JavaStreamTest {
private static List<Pig> pigs = new ArrayList<>();
public static void main(String[] args) {
pigs.add(new Pig(1, "猪爸爸", 31, "M", false));
pigs.add(new Pig(2, "猪妈妈", 28, "F", true));
pigs.add(new Pig(3, "乔治", 2, "M", false));
pigs.add(new Pig(4, "佩奇", 5, "F", false));
System.out.println("===a -> a.getAge() > 5===");
pigs.stream().filter(a -> a.getAge() > 5).forEach(System.out::println);
System.out.println("===Pig::isValid===");
pigs.stream().filter(Pig::isValid).forEach(System.out::println);
System.out.println("===anyMatch(a -> a.getAge() > 50)===");
Boolean anyOldThan50 = pigs.stream().anyMatch(a -> a.getAge() > 50);
System.out.println(anyOldThan50);
System.out.println("===noneMatch(a -> a.getAge() > 50)===");
Boolean noneMatchOldThan50 = pigs.stream().noneMatch(a -> a.getAge() > 50);
System.out.println(noneMatchOldThan50);
System.out.println("===allMatch(a -> a.getAge() < 50)===");
Boolean allLittleThan50 = pigs.stream().allMatch(a -> a.getAge() < 50);
System.out.println(allLittleThan50);
System.out.println("===pigs.stream().findFirst()===");
Optional<Pig> pigOptional = pigs.stream().findFirst();
if (pigOptional.isPresent()){
System.out.println(pigOptional.get().getName());
}
System.out.println("===filter(a -> a.getAge() < 30).findFirst()===");
Optional<Pig> pigOptional2 = pigs.stream().filter(a -> a.getAge() < 30).findFirst();
if (pigOptional2.isPresent()){
System.out.println(pigOptional2.get().getName());
}
System.out.println("comparing(Pig::getAge)");
pigs.sort(comparing(Pig::getAge));
pigs.forEach(System.out::println);
System.out.println("comparing(Pig::getAge).reversed()");
pigs.sort(comparing(Pig::getAge).reversed());
pigs.forEach(System.out::println);
System.out.println("根据性别gender升序排,再以年龄age升序");
pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge));
pigs.forEach(System.out::println);
System.out.println("根据性别gender升序排,再以年龄age降序");
pigs.sort(comparing(Pig::getGender).thenComparing(comparing(Pig::getAge).reversed()));
pigs.forEach(System.out::println);
System.out.println("根据性别gender降序排,再以年龄age升序");
pigs.sort(comparing(Pig::getGender).reversed().thenComparing(Pig::getAge));
pigs.forEach(System.out::println);
System.out.println("根据性别gender降序排,再以年龄age降序");
pigs.sort(comparing(Pig::getGender).thenComparing(Pig::getAge).reversed());
pigs.forEach(System.out::println);
System.out.println("===map(Pig::getGender).collect(toList())===");
List<String> genders = pigs.stream().map(Pig::getGender).collect(toList());
genders.forEach(System.out::println);
System.out.println("====map(Pig::getGender).distinct().collect(toList())===");
List<String> disGenders = pigs.stream().map(Pig::getGender).distinct().collect(toList());
disGenders.forEach(System.out::println);
System.out.println("====map(Pig::getGender).distinct().collect(toSet())===");
Set<String> disGenders2 = pigs.stream().map(Pig::getGender).collect(toSet());
disGenders2.forEach(System.out::println);
System.out.println("===map(Pig::getName).collect(joining(\",\"))===");
String names = pigs.stream().map(Pig::getName).collect(joining(","));
System.out.println(names);
System.out.println("===List转Map, 如果key一样,取第一个=== ");
Map<String, Pig> mapByName = pigs.stream().collect(Collectors.toMap(Pig::getName, a->a, (k1, k2) -> k1));
mapByName.forEach((k, v) -> {
System.out.println(k + " -> " + v.toString());
});
System.out.println("===List转Map>===");
Map<String, List<Pig>> groupByGender = pigs.stream().collect(groupingBy(Pig::getGender));
groupByGender.forEach((k, v) -> {
System.out.println(k + " -> " + v.toString());
});
System.out.println("===groupingBy + counting 统计各个性别的人数===");
Map<String, Long> genderCount = pigs.stream().collect(
Collectors.groupingBy(Pig::getGender, Collectors.counting())
);
genderCount.forEach((k, v) -> System.out.println(k + " -> 人数=" + v));
System.out.println("===.collect(partitioningBy(Pig::isValid))===");
Map<Boolean, List<Pig>> partitioningByValid =pigs.stream().collect(partitioningBy(Pig::isValid));
partitioningByValid.forEach((k, v) -> {
System.out.println(k + " -> " + v.toString());
});
List<Map<String, Object>> pigMapList = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id", "1");
map1.put("name", "猪爸爸");
map1.put("age" , 31);
map1.put("gender" , "M");
Map<String, Object> map2 = new HashMap<>();
map2.put("id", "2");
map2.put("name", "猪妈妈");
map2.put("age" , 28);
map2.put("gender" , "F");
Map<String, Object> map3 = new HashMap<>();
map3.put("id", "3");
map3.put("name", "乔治");
map3.put("age" , 2);
map3.put("gender" , "M");
pigMapList.add(map1);
pigMapList.add(map2);
pigMapList.add(map3);
System.out.println("List);
List<String> pigIds = pigMapList.stream().map(a -> a.get("id").toString()).collect(Collectors.toList());
pigIds.forEach(System.out::println);
System.out.println("List);
String namesOfMap = pigMapList.stream().map(a -> a.get("name").toString()).collect(joining(","));
System.out.println(namesOfMap);
System.out.println("List);
Map<String, List<Map<String, Object>>> groupByGenderMap = pigMapList.stream().collect(groupingBy(e -> e.get("gender").toString()));
groupByGenderMap.forEach((k, v) -> {
System.out.println(k + " -> " + v.toString());
});
long count = pigs.stream().filter(a -> a.getAge() > 5).count();
System.out.println("age > 5的人数 = " + count);
System.out.println("top2");
Stream<Pig> top2Pigs = pigs.stream().sorted(comparing(Pig::getAge)).limit(2);
top2Pigs.forEach(System.out::println);
int sumAge = pigs.stream().mapToInt(Pig::getAge).sum();
int maxAge = pigs.stream().mapToInt(Pig::getAge).max().getAsInt();
int minAge = pigs.stream().mapToInt(Pig::getAge).min().getAsInt();
double avgAge = pigs.stream().mapToInt(Pig::getAge).average().getAsDouble();
System.out.println("sumAge = " + sumAge);
System.out.println("maxAge = " + maxAge);
System.out.println("minAge = " + minAge);
System.out.println("avgAge = " + avgAge);
Optional<Pig> pigMaxAgeOptional = pigs.stream().collect(Collectors.maxBy(comparing(Pig::getAge)));
if (pigMaxAgeOptional.isPresent()){
System.out.println("maxAge = " + pigMaxAgeOptional.get().getAge());
}
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class Pig {
private int id;
private String name;
private Integer age;
private String gender;
private boolean valid;
}