Stream流的中间方法、终结方法与收集方法
Java Stream 流简介
Java Stream 是 Java 8 引入的一个强大的功能,用于处理集合(如 List
、Set
等)中的数据。Stream 提供了一种高效、声明式的方式来对集合进行操作,例如过滤、排序、转换、聚合等。它类似于数据库中的 SQL 查询,允许你以一种更简洁和直观的方式来处理数据。
Stream 的核心概念
-
Stream:数据的序列,可以包含有限或无限个元素。
-
操作:对 Stream 中的数据进行的操作,如过滤、映射、排序等。
-
终端操作:产生结果的操作,如
collect
、forEach
、sum
等。终端操作会触发 Stream 的执行。 -
惰性求值:Stream 的操作是惰性求值的,只有在执行终端操作时,才会真正执行中间操作。
中间方法:
package Stream;import java.util.*;
import java.util.Collections;
import java.util.function.Predicate;
import java.util.stream.Stream;public class demo1 {public static void main(String[] args) {//stream流只能使用一次//修改流中数据,不会影响源数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张三", "张三","张三","李四","李四", "王五", "赵六","张二2");ArrayList<String> list1 = new ArrayList<>();Collections.addAll(list, "append");//filter过滤 留下张开头的list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//true留下,false不要return s.startsWith("张");}}).forEach(s -> System.out.println(s));System.out.println("-------------");Stream<String> stream1 = list.stream().filter(s -> s.startsWith("张"));Stream<String> stream2 = stream1.filter(s -> s.length() == 3);stream2.forEach(s -> System.out.println(s));//还是原数据//System.out.println(list);//limit 获取前几个 skip跳过前几个list.stream().limit(2).forEach(s-> System.out.println(s));System.out.println("-------------");list.stream().skip(2).forEach(s-> System.out.println(s));System.out.println("-------------");//distinct去重,依赖hashcode与equalslist.stream().distinct().forEach(s-> System.out.println(s));System.out.println("-------------");Stream.concat(list1.stream(),list.stream()).forEach(s-> System.out.println(s));}
}
转换流中数据
//stream流只能使用一次//修改流中数据,不会影响源数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张三-10","李四-9", "王五-8", "赵六-7","张二-2");//只获取年龄 string->int//第一个类型,原本数据类型,第二个类型,转换后数据类型//apply形参表示每个数据,返回转换后数据list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {String[] arr = s.split("-");String age1 = arr[1];int age = Integer.parseInt(age1);return age;}}).forEach(s-> System.out.println(s));
终结方法:
package Stream;import java.util.*;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;public class demo1 {public static void main(String[] args) {//stream流只能使用一次//修改流中数据,不会影响源数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张三-10","李四-9", "王五-8", "赵六-7","张二-2");//void forEach(Consumer action)//Cosumer泛型:表示流中数据//方法体打印处理
// list.stream().forEach(new Consumer<String>() {
// @Override
// public void accept(String s) {
// System.out.println(s);
// }
// });list.stream().forEach(s->System.out.println(s));//统计countlong count1 = list.stream().count();System.out.println(count1);//收集toArrayObject[] arr1 = list.stream().toArray();System.out.println(Arrays.toString(arr1));String[] arr2 = list.stream().toArray(value-> new String[value]);System.out.println(Arrays.toString(arr2));}
}
收集方法:
package Stream;import java.util.*;
import java.util.Collections;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class demo1 {public static void main(String[] args) {//collect(Collector collector) 收集流中数据ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张三-男-10","李四-女-9", "王五-男-8", "赵六-女-7","张二-男-2");//收集List集合//收集所有男性List<String> newList = list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toList());System.out.println(newList);//收集set去重Set<String> newlist2 =list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toSet());System.out.println(newlist2);//map 键值对确定//收集男性 键:名字 值:年龄//收集进Map,不可重复,否则报错/*to map :参数一表示键的生成规则参数二表示值的生成规则*///匿名内部类Map<String,Integer> map =list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}}, new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));//lambda表达式System.out.println(map);Map<String,Integer>map2 = list.stream().filter(s->"男".equals(s.split("-")[1])).collect(Collectors.toMap(s->s.split("-")[0],s->Integer.parseInt(s.split("-")[2])));System.out.println(map2);}
}