Collection体系的集合,使用Collection接口的默认方法,stream方法生成流
// Collection 体系的集合使用 接口的默认方法 stream() 生成流
List list = new ArrayList<>();
Stream listStream = list.stream();
Set set = new HashSet<>();
Stream setStream = set.stream();
// Map 体系的集合间接生成流
Map map = new HashMap<>();
Stream keySetStream = map.keySet().stream();
Stream valuesStream = map.values().stream();
Stream> entryStream = map.entrySet().stream();
// 数组通过 Stream接口的静态方法 of(T ...values) 生成流
String[] strArray = {"hello","world","java"};
Stream strArrayStream = Stream.of(strArray);
Stream strArrayStream2 = Stream.of("hello", "world", "java");
Stream integerStream = Stream.of(10, 20, 30);
System.out.println(list.stream().getClass());
System.out.println(new HashSet<>().stream().getClass());
// class java.util.stream.ReferencePipeline$Head
// class java.util.stream.ReferencePipeline$Head
System.out.println(list.getClass());
// class java.util.ArrayList
System.out.println(new HashSet<>().getClass());
// class java.util.HashSet
Stream流的常见中间操作
// 该方法在 ReferencePipeline 类中进行了实现, 我们需要做的就是, 提供 Predicate接口中test抽象方法的实现逻辑。 // 其余的事情, 源码中已经帮我们做好了。 Streamfilter(Predicate super T> predicate);
ArrayListlist = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); list.stream().filter(s -> s.startsWith("张")) .filter(s -> s.length() == 3) .forEach(System.out::println);
// 这两个方法也是在 ReferencePipeline 类中进行了实现 Streamlimit(long maxSize); Stream skip(long n);
// 取前两个数据
list.stream().limit(2).forEach(System.out::println);
System.out.println("------------");
// 跳过前两个数据
list.stream().skip(2).forEach(System.out::println);
System.out.println("------------");
// 跳过前两个数据, 取剩下元素的前两个
list.stream().skip(2).limit(2).forEach(System.out::println);
// Stream接口中的静态方法, 需要使用接口进行调用 staticStream concat(Stream extends T> a, Stream extends T> b) // 在 ReferencePipeline 类中进行了实现 Stream distinct()
Streams1 = list.stream().limit(4); Stream s2 = list.stream().skip(2); // 合并两个流 Stream.concat(s1,s2).forEach(System.out::println); // 返回由该流的不同元素组成的流 Stream.concat(s1,s2).distinct().forEach(System.out::println);
// 这两个方法也是在 ReferencePipeline 类中进行了实现 Streamsorted() // 自然顺序排序 Stream sorted(Comparator super T> comparator) // 根据指定比较器进行排序
list.stream().sorted((s1,s2) -> {
int num = s1.length() - s2.length();
int num2 = num == 0 ? s1.compareTo(s2):num;
return num2;
}).forEach(System.out::println);
// 这两个方法同样是在 ReferencePipeline 类中进行了实现。 // 参数: 实现 Function接口中 apply方法的 lambda表达式Stream map(Function super T, ? extends R> mapper); // 将给定函数 apply 应用于此流元素 // IntStream表示原始 int 流, ToIntFunction接口中的抽象方法:`int applyAsInt(T value);` IntStream mapToInt(ToIntFunction super T> mapper); // 将给定函数 applyAsInt 应用于此流元素
ArrayListStream流常见终结操作list = new ArrayList<>(); list.add("10"); list.add("20"); list.add("30"); list.add("40"); list.add("50"); list.stream().map(Integer::parseInt).forEach(System.out::println); int result = list.stream().mapToInt(Integer::parseInt).sum(); System.out.println(result);
void forEach(Consumer super T> action); // 对此流的每个元素执行操作 long count(); // 返回此流中的元素个数
ArrayListStream流的收集操作list = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.stream().forEach(System.out::print); long count = list.stream().filter(s -> s.startsWith("张")).count(); System.out.println(count);
// 在ReferencePipeline中进行实现R collect(Collector super T, A, R> collector);
Collectors类中有一个静态内部类CollectorImpl实现了Collector接口
static class CollectorImplimplements Collector
以下都是Collectors类的静态方法,返回一个CollectorImpl对象。
Collector> toList() Collector > toSet() Collector > toMap(Function super T, ? extends K> keyMapper, Function super T, ? extends U> valueMapper)
ListnewList = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toList()); System.out.println(newList);
原来你是这样的 Stream
内部类和静态内部类的区别
Java Stream 源码深入解析



