示例:从句子中得到单词
String worlds = "The way of the future"; List<String> list7 = new ArrayList<>(); list7.add(worlds); List<String> list8 = list7.stream().flatMap(str -> Stream.of(str.split(" "))) .filter(world -> world.length() > 0).collect(Collectors.toList()); System.out.println("单词:"); list8.forEach(System.out::println); // 单词: // The // way // of // the // future6.Stream流的limit使用
limit 方法用于获取指定数量的流。
示例一:获取前n条数的数据
Random rd = new Random(); System.out.println("取到的前三条数据:"); rd.ints().limit(3).forEach(System.out::println); // 取到的前三条数据: // 1167267754 // -1164558977 // 1977868798示例二:结合skip使用得到需要的数据
skip表示的是扔掉前n个元素。
List<User> list9 = new ArrayList<User>(); for (int i = 1; i < 4; i++) { User user = new User(i, "pancm" + i); list9.add(user); } System.out.println("截取之前的数据:"); // 取前3条数据,但是扔掉了前面的2条,可以理解为拿到的数据为 2<=i<3 (i 是数值下标) List<String> list10 = list9.stream().map(User::getName).limit(3).skip(2).collect(Collectors.toList()); System.out.println("截取之后的数据:" + list10); // 截取之前的数据: // 姓名:pancm1 // 姓名:pancm2 // 姓名:pancm3 // 截取之后的数据:[pancm3]注:User实体类中 getName 方法会打印姓名。
7.Stream流的sort使用
sorted方法用于对流进行升序排序。
示例一:随机取值排序
Random rd2 = new Random(); System.out.println("取到的前三条数据然后进行排序:"); rd2.ints().limit(3).sorted().forEach(System.out::println); // 取到的前三条数据然后进行排序: // -2043456377 // -1778595703 // 1013369565示例二:优化排序
tips:先获取在排序效率会更高!
//普通的排序取值 List<User> list11 = list9.stream().sorted((u1, u2) -> u1.getName().compareTo(u2.getName())).limit(3) .collect(Collectors.toList()); System.out.println("排序之后的数据:" + list11); //优化排序取值 List<User> list12 = list9.stream().limit(3).sorted((u1, u2) -> u1.getName().compareTo(u2.getName())) .collect(Collectors.toList()); System.out.println("优化排序之后的数据:" + list12); //排序之后的数据:[{"id":1,"name":"pancm1"}, {"id":2,"name":"pancm2"}, {"id":3,"name":"pancm3"}] //优化排序之后的数据:[{"id":1,"name":"pancm1"}, {"id":2,"name":"pancm2"}, {"id":3,"name":"pancm3"}]8.Stream流的peek使用
peek对每个元素执行操作并返回一个新的Stream
示例:双重操作
System.out.println("peek使用:"); Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("转换之前: " + e)) .map(String::toUpperCase).peek(e -> System.out.println("转换之后: " + e)).collect(Collectors.toList()); // 转换之前: three // 转换之后: THREE // 转换之前: four // 转换之后: FOUR9.Stream流的parallel使用
parallelStream 是流并行处理程序的代替方法。
示例:获取空字符串的数量
List<String> strings = Arrays.asList("a", "", "c", "", "e","", " "); // 获取空字符串的数量 long count = strings.parallelStream().filter(string -> string.isEmpty()).count(); System.out.println("空字符串的个数:"+count);10.Stream流的max/min/distinct使用
示例一:得到最大最小值
List<String> list13 = Arrays.asList("zhangsan","lisi","wangwu","xuwujing"); int maxLines = list13.stream().mapToInt(String::length).max().getAsInt(); int minLines = list13.stream().mapToInt(String::length).min().getAsInt(); System.out.println("最长字符的长度:" + maxLines+",最短字符的长度:"+minLines); //最长字符的长度:8,最短字符的长度:4示例二:得到去重之后的数据
String lines = "good good study day day up"; List<String> list14 = new ArrayList<String>(); list14.add(lines); List<String> words = list14.stream().flatMap(line -> Stream.of(line.split(" "))).filter(word -> word.length() > 0) .map(String::toLowerCase).distinct().sorted().collect(Collectors.toList()); System.out.println("去重复之后:" + words); //去重复之后:[day, good, study, up]11.Stream流的Match使用
allMatch:Stream 中全部元素符合则返回 true ;
anyMatch:Stream 中只要有一个元素符合则返回 true;
noneMatch:Stream 中没有一个元素符合则返回 true。
示例:数据是否符合
boolean all = lists.stream().allMatch(u -> u.getId() > 3); System.out.println("是否都大于3:" + all); boolean any = lists.stream().anyMatch(u -> u.getId() > 3); System.out.println("是否有一个大于3:" + any); boolean none = lists.stream().noneMatch(u -> u.getId() > 3); System.out.println("是否没有一个大于3的:" + none); // 是否都大于3:false // 是否有一个大于3:true // 是否没有一个大于3的:false12.Stream流的reduce使用
reduce 主要作用是把 Stream 元素组合起来进行操作。
示例一:字符串连接
String concat = Stream.of("A", "B", "C", "D").reduce("", String::concat); System.out.println("字符串拼接:" + concat);示例二:得到最小值
double minValue = Stream.of(-4.0, 1.0, 3.0, -2.0).reduce(Double.MAX_VALUE, Double::min); System.out.println("最小值:" + minValue); //最小值:-4.0