/**
* 比较排序
*/
@Test
public void comparing(){
List<Person> personList = Arrays.asList(new Person("张三",21,70),new Person("李四",22,55),new Person("王五",23,60));
/**
* 该方法引用 Employee::getName 可以代替 lambda表达式
*/
personList.sort(Comparator.comparing(Person::getWeight));
/**
* Comparator.comparing 方法的使用
* comparing 方法接收一个 Function 函数式接口 ,通过一个 lambda 表达式传入
*
*/
personList.sort(Comparator.comparing(e -> e.getWeight()));
System.out.println(personList);
//输出结果 :[Person(name=李四, age=22, weight=55), Person(name=王五, age=23, weight=60), Person(name=张三, age=21, weight=70)]
/**
* 相反的排序规则
*/
personList.sort(Comparator.comparing(Person::getWeight).reversed());
System.out.println(personList);
//输出结果 :[Person(name=张三, age=21, weight=70), Person(name=王五, age=23, weight=60), Person(name=李四, age=22, weight=55)]
/**
* null元素排在集合的最前面
* 当集合中存在null元素时,可以使用针对null友好的比较器,
* 这里得null 指定是对象是null,而非某一个对象中得值为null
*/
List<Person> personNullList = Arrays.asList(new Person("张三",21,70),new Person("李四",22,55),new Person("王五",23,60),null);
Collections.sort(personNullList, Comparator.nullsFirst(Comparator.comparing(Person::getWeight)));
System.out.println(personNullList);
//输出结果 : [null, Person(name=李四, age=22, weight=55), Person(name=王五, age=23, weight=60), Person(name=张三, age=21, weight=70)]
/**
* null元素排在集合的最后面
*/
Collections.sort(personNullList, Comparator.nullsLast(Comparator.comparing(Person::getWeight)));
System.out.println(personNullList);
//输出结果:[Person(name=李四, age=22, weight=55), Person(name=王五, age=23, weight=60), Person(name=张三, age=21, weight=70), null]
}
/**
* 转换,筛选
*/
@Test
public void streamStringList(){
List<Person> personList = Arrays.asList(
new Person("张三",21,70),
new Person("李四",22,80),
new Person("王五",23,60));
//查询大于21岁
List<Person> colorList2 = personList.stream().filter(t->t.getAge()>21).collect(Collectors.toList());
System.out.println(colorList2);
//输出: [Person(name=李四, age=22, weight=80), Person(name=王五, age=23, weight=60)]
//查询大于21岁,只输出名称
List<String> colorList1 = personList.stream().filter(t->t.getAge()>21).map(Person::getName).collect(Collectors.toList());
System.out.println(colorList1);
//输出:[李四, 王五]
//查询大于21岁,并按照weight 排序,只输出名称
List<String> colorList = personList.stream().filter(t->t.getAge()>21).sorted(Comparator.comparing(Person::getWeight)).map(Person::getName).collect(Collectors.toList());
System.out.println(colorList);
//输出:[王五, 李四]
}
/**
* 匹配
*/
@Test
public void streamMatch(){
//anyMatch
//流中是否有一个元素能够匹配所给定谓词,只有有一个匹配上就返回 true
List<Person> personList = Arrays.asList(
new Person("张三",21,70),
new Person("李四",23,80),
new Person("王五",28,60));
boolean res = personList.stream().anyMatch(t -> t.getAge() > 8);
System.out.println(res);
//输出: true
//allMatch()
//流中的元素是否都能匹配给定的谓词,所有匹配上才能返回 true
boolean res1 = personList.stream().allMatch(t -> t.getAge() > 8);
System.out.println(res1);
//noneMatch()
//流中没有任何元素与给定的谓词相匹配,有一个匹配就会返回 false
boolean res2 = personList.stream().noneMatch(t -> t.getAge() > 8);
System.out.println(res2);
}
/**
* 查找
*/
@Test
public void streamFindAny(){
//findAny
//返回当前流中的任意元素
List<Person> personList = Arrays.asList(
new Person("张三",21,70),
new Person("李四",23,80),
new Person("王五",28,60));
Optional<Person> a = personList.stream().filter(t->t.getAge() >23 ).findAny();
System.out.println(a.get());
//findFirst
//返回当前流中的第一个元素
Optional<Person> a1 = personList.stream().filter(t->t.getAge() > 8).findFirst();
System.out.println(a1.get());
}
/**
* 最大值,最小值
*/
@Test
public void streamReduce (){
//findAny
//返回当前流中的任意元素
List<Person> personList = Arrays.asList(
new Person("张三",21,70),
new Person("李四",23,80),
new Person("王五",28,60)
);
Optional<Person> max = personList.stream().collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
System.out.println(max.get());
//输出:Person(name=王五, age=28, weight=60)
Optional<Person> min = personList.stream().collect(Collectors.minBy(Comparator.comparing(Person::getAge)));
System.out.println(min.get());
//输出:Person(name=张三, age=21, weight=70)
//来求和:
Integer sum = personList.stream().collect(Collectors.summingInt(Person::getAge));
System.out.println(sum);
//输出: 72
//平均数:
Double avg = personList.stream().collect(Collectors.averagingInt(Person::getAge));
System.out.println(avg);
//输出: 24.0
//用来连接字符串
String color = personList.stream().map(Person::getName).collect(Collectors.joining(", "));
System.out.println(color);
//输出:张三, 李四, 王五
//分组 求分组总数
Map<String, Long> longMap = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.counting()));
System.out.println(longMap);
Map<String, Map<String, List<Person>>> collect = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(t -> {
if (t.getAge() >21) {
return "LOW_PRICE";
} else {
return "HIGHT_PRICE";
}
})));
System.out.println(collect);
Map<String, Person> f = personList.stream().collect(Collectors.groupingBy(Person::getName, Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingInt(Person::getAge)), Optional::get)));
System.out.println(f);
}
/**
* 创建流
*/
@Test
public void streamList(){
//List创建流
List<String> list = Arrays.asList("hello","world","stream");
//创建顺序流
Stream<String> stream = list.stream();
//创建并行流
Stream<String> parallelStream = list.parallelStream();
//数组创建流
String[] array = {"h", "e", "l", "l", "o"};
Stream<String> arrayStream = Arrays.stream(array);
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4, 5, 6);
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(3);
stream2.forEach(System.out::println);
Stream<Double> stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);
}
/**
* Option
*/
@Test
public void streamOption (){
//创建一个空的Optional
Optional<Person> personOpt = Optional.empty();
//创建一个非空的Optional
Optional<Person> personOpt1 = Optional.of( new Person("张三",21,70));
//Optional 中的 map()方法和流中的map()相似,都是从Optional对象中提取和转换值。
System.out.println(personOpt1.map(Person::getName).get());
//创建一个可接受空值的Optional
Optional<Person> personOpt2 = Optional.ofNullable(null);
System.out.println(this.getPhoneType( new Person("张三",21,70)));
}
//利用null
private String getPhoneType(Person person) {
return Optional.ofNullable(person).map(Person::getName).orElse("");
}
/**
* 新的日期和时间
*/
@Test
public void streamLocalDate (){
LocalDate nowDate = LocalDate.now();
System.out.println(nowDate.toString());
//输出:2024-02-05
//创建一个空的Optional
LocalDate nowDate1 = LocalDate.of(2020,7,18);
System.out.println(nowDate1.toString());
//输出:2020-07-18
int year = nowDate.getYear(); //2020
System.out.println(year);
Month month = nowDate.getMonth(); //07
System.out.println(month);
int day = nowDate.getDayOfMonth(); //18
System.out.println(day);
DayOfWeek dayOfWeek = nowDate.getDayOfWeek(); //SATURDAY
System.out.println(dayOfWeek.toString());
int days = nowDate.lengthOfMonth(); //31
System.out.println(days);
}
Java8方法
于 2023-08-16 17:02:46 首次发布