java8 之 stream流

it2023-07-02  64

package com.mozi.stream; public class User { private String name; private int age; public User() { } public User(String name, int age) { this.name = name; this.age = age; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ```java package com.mozi.stream; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.Before; import org.junit.Test; public class StreamTest { private List<User> userList; @Before public void streamNew() { userList = new ArrayList<User>(); User user1 = new User("小花", 13); User user2 = new User("大花", 16); User user3 = new User("小米", 23); User user4 = new User("大米", 24); User user5 = new User("张三", 18); User user6 = new User("李四", 15); User user7 = new User("王五", 22); User user8 = new User("李珊珊", 29); User user9 = new User("朝夕夕", 24); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); userList.add(user5); userList.add(user6); userList.add(user7); userList.add(user8); userList.add(user9); } /** * 12、使用collect()做字符串joining() */ @Test public void streamCollect() { Stream<String> stream = Stream.of("张三","李四","王五","赵六"); // 张三李四王五赵六 //String string = stream.collect(Collectors.joining()); //System.out.println(string); // 张三-李四-王五-赵六 String string2 = stream.collect(Collectors.joining("-"," "," ")); System.out.println(string2); } /** * 11、reduce() :多面手 */ @Test public void streamReduce() { //userList.stream().max(Comparator.comparing(keyExtractor, keyComparator)) Integer reduce = userList.stream().map(user -> user.getAge()) .reduce(10,(x,y) -> x+y); System.out.println(reduce); } /** * findFirst() :使用该方法获取第一个元素 */ @Test public void streamFindFirst() { Optional<User> findFirst = userList.stream().findFirst(); User user = findFirst.get(); System.out.println(user); //Stream<String> map = userList.stream().map(user -> user.getName()); } // flatMap与map的区别在于 flatMap是将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 。 /** * flatMap():对每个元素执行mapper指定的操作, * 并用所有mapper返回的Stream中的元素组成一个新的Stream作为最终返回结果, * 通俗易懂就是将原来的stream中的所有元素都展开组成一个新的stream */ @Test public void streamFlatMap() { List<String> list1 = Arrays.asList("aa","bb","cc"); List<String> list2 = Arrays.asList("dd","ee"); Stream<List<String>> stream = Stream.of(list1,list2); //stream.flatMap() } /** * 8、map():接收一个方法作为参数, * 该函数会被应用到每个元素上,并将其映射成一个新的元素 */ @Test public void streamMap() { // userList.stream().map(User::getAge) // .forEach(System.out::println); } /** * max,min,sum,avg,count 求平均值 */ @Test public void StreamArith() { IntSummaryStatistics num = userList.stream(). mapToInt(user -> user.getAge()) .summaryStatistics(); System.out.println("总共人数:" + num.getCount()); System.out.println("平均年龄:" + num.getAverage()); System.out.println("最大年龄:" + num.getMax()); System.out.println("最小年龄:" + num.getMin()); System.out.println("年龄之和:" + num.getSum()); } /** * demo: 去重+按照年龄大于20以后从小到大+只取前二 */ @Test public void streamDemo() { List<User> list = userList.stream().distinct() .filter(user -> user.getAge() > 20) .sorted(Comparator.comparingInt(User::getAge)) .limit(2L).collect(Collectors.toList()); list.stream().forEach(System.out::println); } /** * distinct(): 使用该方法去重,注意:必须重写对应泛型的hashCode()和equals()方法 */ @Test public void streamDistinct() { List<User> list = userList.stream().distinct().collect(Collectors.toList()); list.stream().forEach(System.out::println); } /** * skip():与limit互斥,使用该方法跳过元素 */ @Test public void streamSkip() { userList.stream().skip(2L).forEach(System.out::println); } /** * limit():使用该方法截断(只保留前几个数据) */ @Test public void streamLimit() { userList.stream().limit(2).forEach(System.out::println); } @Test public void StreamFilter() { // 输出年龄大于20的人 List<User> list = userList.stream().filter(user -> user.getAge() > 20).collect(Collectors.toList()); list.forEach(user -> System.out.println(user)); } @Test public void streamForEach() { userList.forEach(user -> System.out.println(user)); userList.stream().forEach(System.out::print); } @Test public void streamSorted() { userList.stream().sorted(Comparator.comparingInt(User::getAge)).forEach(System.out::print); } }
最新回复(0)