package com.ling.stream;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Collection {
public static void main(String[] args) {
}
private static void a(){
List<Integer> list = new ArrayList<>();
list.add(3);list.add(2);list.add(1);list.add(4);list.add(5);
list.stream().filter(a -> a > 2).findFirst().stream().map(x -> x).forEach(x -> System.out.print(x + " "));
System.out.println();
List<String> lista = Arrays.asList("node", "java", "c++", "react", "javascript");
String result = lista.stream().reduce((first, second) -> second).orElse("no last element");
System.out.println(result);
List list1 = list.stream().filter(a -> a > 2).collect(Collectors.toList());
System.out.println(list1.get(list1.size()-1));
}
private static void b(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,23,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList()).forEach(System.out::println);
System.out.println();
listPerson.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList()).forEach(System.out::println);
System.out.println();
System.out.println(new ArrayList<>(listPerson).get(listPerson.size()-1).name);
System.out.println();
listPerson.stream().sorted(Comparator.comparing(Person::getAge).thenComparing(Person::getSalary).reversed()).forEach(System.out::println);
System.out.println();
List<Integer> list = new ArrayList<>();
list.add(3);list.add(2);list.add(1);list.add(4);list.add(5);list.add(8);list.add(42);
list.add(17);list.add(79);list.add(78);list.add(78);list.add(124);list.add(232);list.add(12);
list.stream().filter(x -> x > 4).forEach(System.out::print);
System.out.println();
list.stream().filter(x -> x > 4).distinct().skip(2).limit(2).forEach(System.out::print);
System.out.println();
}
private static void c(){
List<Integer> list2 = Arrays.asList(1,2,6,3,7,4,2);
Optional<Integer> max = list2.stream().max(Integer::compareTo);
Optional<Integer> max2 = list2.stream().max(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println("自然排序(自带方法):" + max.get());
System.out.println("自定意排序(最大值):" + max2.get());
}
private static void d(){
String[] arr1 = {"a","b","c","d"};
String[] arr2 = {"r","a","g","j"};
Stream<String> stream1 = Stream.of(arr1);
Stream<String> stream2 = Stream.of(arr2);
Stream<String> stream3 = Stream.of(" ",""," ",null);
Stream<String> stream4 = Stream.of(arr2);
List<String> listA = Stream.concat(stream1,stream2).collect(Collectors.toList());
List<String> listB = Stream.concat(stream4,stream3).collect(Collectors.toList());
List<Integer> listC = Stream.iterate(2,x -> x + 3).limit(7).collect(Collectors.toList());
List<Integer> listD = Stream.iterate(0,x -> x + 2).skip(3).limit(3).collect(Collectors.toList());
System.out.println(listD);
Stream.iterate(0,x -> x + 2).skip(3).limit(3).collect(Collectors.toList()).forEach(System.out::println);
}
private static void e(){
ArrayList<Person> person = new ArrayList<>();
person.add(new Person("甲一",3000,21,"man","aa"));
person.add(new Person("甲二",3100,22,"woman","bb"));
person.add(new Person("甲三",3200,23,"man","cc"));
person.add(new Person("甲四",3300,24,"woman","dd"));
person.add(new Person("甲五",3400,25,"man","ee"));
person.stream().map(x -> x.age > 23).forEach(x -> System.out.print(x + " "));
System.out.println();
person.stream().filter(x -> x.age > 23).forEach(x -> System.out.print(x + " "));
Optional<Integer> sumSalary = person.stream().map(Person::getSalary).reduce(Integer::sum);
Integer sumSalary2 = person.stream().reduce(0, (sum, p) -> sum += p.getSalary(),
Integer::sum);
Integer sumSalary3 = person.stream().reduce(1000, (sum, p) -> sum += p.getSalary(), Integer::sum);
Integer maxSalary = person.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(),
Integer::max);
Integer maxSalary2 = person.stream().reduce(1000, (max, p) -> max > p.getSalary() ? max : p.getSalary(),
(max1, max2) -> max1 > max2 ? max1 : max2);
System.out.println("工资之和:" + sumSalary.get() + "," + sumSalary2 + "," + sumSalary3);
System.out.println("最高工资:" + maxSalary + "," + maxSalary2);
}
public static void f(){
String reduceA = Stream.of("1","2",""," ","3","4").reduce("",String::concat);
System.out.println("1:" + reduceA);
Optional<String> rB = Stream.of("1","2",""," ","3","4").reduce(String::concat);
String reduceB = rB.get();
System.out.println("2:" + reduceB);
System.out.print("3:");
Stream.of("1","2",""," ","3","4").reduce(String::concat).stream().forEach(System.out::println);
}
public static void g(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
Integer sum = listPerson.stream().collect(Collectors.reducing(500,
Person::getSalary,(i,j) -> (i + j - 500)));
System.out.println("员工减去起征点后的薪资之和:"+sum);
Optional<Integer> sum2 = listPerson.stream().map(Person::getSalary).reduce(Integer::sum);
System.out.println("员工薪资总和:"+sum2.get());
}
public static void h(){
Stream<Integer> integerStream = Arrays.stream(new Integer[]{1, 1});
Integer result = integerStream.reduce(1,Integer::sum);
System.out.println(result);
integerStream = Arrays.stream(new Integer[]{1,2,3,4});
integerStream.reduce((i, j) -> i + j).ifPresent(System.out::println);
}
private static void one(){
List<Integer> list = new ArrayList<>();
list.add(1);list.add(2);list.add(3);list.add(4);
Optional<Integer> any = list.parallelStream().findAny();
System.out.println(any);
list.parallelStream().forEach(a->{
System.out.println(a);
});
}
private static void two(){
List<Integer> list = Arrays.asList(0,5,9,3,7,59,2,8,55,1);
System.out.print("所有小于6的:");
list.stream().filter(x -> x < 6).forEach(System.out::print);
System.out.println();
System.out.print("小于6的最后一个:");
List list1 = list.stream().filter(x -> x < 6).collect(Collectors.toList());
System.out.print(list1.get(list1.size()-1));
System.out.println();
Optional<Integer> first = list.stream().filter(x -> x > 8).findFirst();
System.out.println(first);
Optional<Integer> any = list.parallelStream().findAny();
list.parallelStream().forEach(a->{
System.out.println(a);
});
System.out.println(any);
boolean b1 = list.stream().anyMatch(x -> x < 6);
boolean b2 = list.stream().allMatch(x -> x < 6);
System.out.println("匹配大于某一个值的第一个值:"+first.get());
System.out.println("匹配任意一个值:"+any.get());
System.out.println("是否存在小于6的值:"+b1);
System.out.println("是否存在小于6得值:"+b2);
}
private static void twoTestOne(){
List<Integer> list = Arrays.asList(1,8,3,6,2,9,5,7,3,4);
list.stream().filter(x -> x > 7 ).forEach(System.out::print);
System.out.println();
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
List<String> stringList = listPerson.stream().filter(x -> x.getSalary() > 3200 )
.map(Person::getName).collect(Collectors.toList());
List<String> listN = listPerson.stream().filter(x -> x.getAge() < 23).map(Person::getName)
.collect(Collectors.toList());
System.out.println("工资大于 3200 输出姓名:"+stringList);
System.out.println("年龄小于23 的输出姓名:"+listN);
Optional<Person> listS = listPerson.stream().max(Comparator.comparing(Person::getSalary));
Optional<Person> optionalPerson = listPerson.stream().min(Comparator.comparing(Person::getAge));
System.out.println("获取工资最高的:"+listS.get().getName()+" "+listS.get().getSalary());
System.out.println("年龄最小的:"+optionalPerson);
System.out.println("年龄最小的:"+optionalPerson.get().getName());
List<String> list1 = Arrays.asList("admin","re","orange","cow");
Optional<String> optionalS = list1.stream().max(Comparator.comparing(String::length));
System.out.println(optionalS.get());
}
private static void three(){
List<Integer> list2 = Arrays.asList(1,2,6,3,7,4,2);
Optional<Integer> max = list2.stream().max(Integer::compareTo);
Optional<Integer> max2 = list2.stream().max(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
});
System.out.println("自然排序(自带方法):"+max.get());
System.out.println("自定意排序(最大值):"+max2.get());
List<Integer> list3 = Arrays.asList(1,8,9,7,77,76,67,78,79,0);
Integer integer = Math.toIntExact(list3.stream().filter(x -> x > 6).count());
long l = list3.stream().filter(x -> x > 6).count();
System.out.println("集合中大于6的元素的个数(1):" + integer + " 集合中大于6的元素的个数(2):" + l);
}
private static void four(){
String[] str = {"abed","accuses","calcium","AONadja"};
List<String> strList = Arrays.stream(str).map(String::toUpperCase).collect(Collectors.toList());
List<Integer> list = Arrays.asList(1,3,7,93,26,73,2,7,8);
List<Integer> intList = list.stream().map(x -> x + 3).collect(Collectors.toList());;
System.out.println("数组元素变成大写:"+strList);
System.out.println("整数数组+3:"+intList);
System.out.println();
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
List<Person> listPersonNew = listPerson.stream().map(person -> {
Person personNew = new Person(person.getName(), 0,0,null,null);
personNew.setSalary(person.getSalary()+1000);
return personNew;
}).collect(Collectors.toList());
System.out.println("一次改动前:"+listPerson.get(0).getName() + " ---> " + listPerson.get(0).getSalary());
System.out.println("一次改动后:"+listPersonNew.get(0).getName() + " ---> " + listPersonNew.get(0).getSalary());
List<Person> listPersonNewTwo = listPerson.stream().map(person -> {
person.setSalary(person.getSalary()+1000);
return person;
}).collect(Collectors.toList());
System.out.println("二次改动前:"+listPerson.get(1).getName()+" ---> "+ listPerson.get(1).getSalary());
System.out.println("二次改动后:"+listPersonNewTwo.get(1).getName()+" ---> "+ listPersonNewTwo.get(1).getSalary());
}
private static void five(){
List<Integer> list1 = Arrays.asList(1,2,3,4,5,6,7,8,9);
Optional<Integer> sum1 = list1.stream().reduce((x,y) -> x + y);
Optional<Integer> sum2 = list1.stream().reduce((Integer::sum));
Integer sum3 = list1.stream().reduce(0,Integer::sum);
Optional<Integer> product = list1.stream().reduce((x,y) -> x * y);
Optional<Integer> max1 = list1.stream().reduce((x,y) -> x > y ? x: y);
Integer max2 = list1.stream().reduce(99,Integer::max);
System.out.println("求和方式一:"+sum1.get()+" 求和方式二:"+sum2.get()+" 求和方式三:"+sum3);
System.out.println("乘积:"+product.get());
System.out.println("最大值方式一:"+max1.get()+" 最大值方式二:"+max2);
}
private static void fiveTwo(){
List<Person> personList = new ArrayList<Person>();
personList.add(new Person("甲一",3000,21,"man","aa"));
personList.add(new Person("甲二",3100,22,"woman","bb"));
personList.add(new Person("甲三",3200,23,"man","cc"));
personList.add(new Person("甲四",3300,24,"woman","dd"));
personList.add(new Person("甲五",3400,25,"man","ee"));
Optional<Integer> sumSalary = personList.stream().map(Person::getSalary).reduce(Integer::sum);
Integer sumSalary2 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(),
(sum1, sum2) -> sum1 + sum2);
Integer sumSalary3 = personList.stream().reduce(1000, (sum, p) -> sum += p.getSalary(), Integer::sum);
Integer maxSalary = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(),
Integer::max);
Integer maxSalary2 = personList.stream().reduce(1000, (max, p) -> max > p.getSalary() ? max : p.getSalary(),
(max1, max2) -> max1 > max2 ? max1 : max2);
System.out.println("工资之和:" + sumSalary.get() + "," + sumSalary2 + "," + sumSalary3);
System.out.println("最高工资:" + maxSalary + "," + maxSalary2);
}
public static void six(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);
List<Integer> listNew = list.stream().filter(x -> x % 2 == 0 ).collect(Collectors.toList());
System.out.println("list "+listNew);
Set<Integer> set1 = list.stream().collect(Collectors.toSet());
Set<Integer> set2 = list.stream().filter(x -> x % 2 ==0 ).collect(Collectors.toSet());
System.out.println("set1 "+set1+" set2 "+set2);
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
Map<?,Person> map = listPerson.stream().filter(p -> p.getSalary() > 3200).collect(Collectors.toMap(Person::getName, p -> p));
System.out.println("map "+map);
}
private static void seven(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
Long count = listPerson.stream().collect(Collectors.counting());
Double avg = listPerson.stream().collect(Collectors.averagingDouble(Person::getSalary));
Double integer = listPerson.stream().collect(Collectors.summingDouble(Person::getAge));
Double sum = listPerson.stream().collect(Collectors.summingDouble(Person::getSalary));
Optional<Integer> max = listPerson.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::compare));
Optional<Integer> min = listPerson.stream().map(Person::getSalary).collect(Collectors.minBy(Integer::compareTo));
Double collect = listPerson.stream().collect(Collectors.summingDouble(Person::getSalary));
System.out.println("员工总数:"+count);
System.out.println("平均工资:"+avg);
System.out.println("工资总额:"+sum);
System.out.println("最高工资:"+max.get());
System.out.println("最低工资:"+min.get());
System.out.println("一次性统计所有信息:"+collect);
}
public static void eight(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
Map<Boolean,List<Person>> map = listPerson.stream().collect(Collectors.partitioningBy(x -> x.getSalary() > 3000));
Map<String,List<Person>> map1 = listPerson.stream().collect(Collectors.groupingBy(Person::getSex));
Map<String,Map<String,List<Person>>> mapMap = listPerson.stream()
.collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(Person::getArea)));
System.out.println("按薪资是否高于3000"+map);
System.out.println("按照性别分组"+map1);
System.out.println("先按照性别分组,再按地区分组"+mapMap);
}
public static void nine(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
String names = listPerson.stream().map(p -> p.getName()).collect(Collectors.joining(","));
System.out.println("所有员工的姓名:"+names);
List<String> list = Arrays.asList("A","B","C");
String string = list.stream().collect(Collectors.joining("-"));
System.out.println("拼接后的字符串:"+string);
}
public static void ten(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
Integer sum = listPerson.stream().collect(Collectors.reducing(0,
Person::getSalary,(i,j) -> (i + j - 500)));
System.out.println("员工减去起征点后的薪资之和:"+sum);
Optional<Integer> sum2 = listPerson.stream().map(Person::getSalary).reduce(Integer::sum);
System.out.println("员工薪资总和:"+sum2.get());
}
public static void eleven(){
List<Person> listPerson = new ArrayList<>();
listPerson.add(new Person("甲一",3000,21,"man","aa"));
listPerson.add(new Person("甲二",3100,22,"woman","bb"));
listPerson.add(new Person("甲三",3200,23,"man","cc"));
listPerson.add(new Person("甲四",3300,24,"woman","dd"));
listPerson.add(new Person("甲五",3400,25,"man","ee"));
List<String> listP = listPerson.stream().sorted(Comparator.comparing(Person::getSalary))
.map(Person::getName).collect(Collectors.toList());
List<String> listI = listPerson.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
.map(Person::getName).collect(Collectors.toList());
List<Person> listAll = listPerson.stream().sorted(Comparator.comparing(Person::getSalary).reversed())
.collect(Collectors.toList());
List<String> listS = listPerson.stream().sorted(Comparator.comparing(Person::getSalary)
.thenComparing(Person::getAge)).map(Person::getName).collect(Collectors.toList());
List<String> listD = listPerson.stream().sorted((p1,p2) -> {
if (p1.getSalary().equals(p2.getSalary())){
return p2.getAge()-p1.getAge();
} else {
return p2.getSalary()-p1.getSalary();
}
}).map(Person::getName).collect(Collectors.toList());
System.out.println("按工资升序排序(自然排序):"+listP);
System.out.println("按工资倒序排序只输出姓名:"+listI);
System.out.println("按工资倒序排序输出全部:"+listAll);
System.out.println("先按工资再按年龄升序排序:"+listS);
System.out.println("先按工资再按年龄进行自定义排序(降序):"+listD);
List<Integer> list = listPerson.stream().sorted(Comparator.comparing(Person::getAge))
.map(Person::getSalary).collect(Collectors.toList());
System.out.println("通过年龄排序最后输出工资:"+list);
}
public static void twelve(){
String[] arr1 = {"a","b","c","d"};
String[] arr2 = {"r","a","g","j"};
Stream<String> stream1 = Stream.of(arr1);
Stream<String> stream2 = Stream.of(arr2);
List<String> listC = Stream.concat(stream1,stream2).distinct().collect(Collectors.toList());
List<Integer> listI = Stream.iterate(0,x -> x + 1).limit(7).collect(Collectors.toList());
List<Integer> listS = Stream.iterate(0,x -> x + 2).skip(3).limit(3).collect(Collectors.toList());
System.out.println("合并两个流,去重:"+listC);
System.out.println("限制从流中获得前n个数据:"+listI);
System.out.println("跳过前n个数据:"+listS);
}
public static void test(){
int[] a = new int[]{1,2,3,4,5,6};
Integer integer = Arrays.stream(a).reduce(0,Integer::sum);
System.out.println(integer);
}
}