
通过数据源(集合、数组等)生成流
list.stream()
常见生成方式
Collection体系的集合可以直接使用默认方法stream()生成流
//Collection生成流
ArrayList list = new ArrayList<>();
HashSet set = new HashSet<>();
Stream listStream = list.stream();
Stream setStream = set.stream();
Map体系集合间接生成流
//Map生成流
HashMap map = new HashMap<>();
Stream keyStream = map.keySet().stream();
Stream valueStream = 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(1, 2, 3, 4);
一个流后面可以跟随任意个中间操作,目的是打开流,做出过滤或映射等操作,再返回一个新的流
list.stream().filter()//通常使用Lambda表达式完成规则表达
常见操作方法
filter(Predicate predicate):用于对流中的数据进行过滤
Predicate接口中的方法 boolean test(T t):对给定参数进行判断,返回一个布尔值
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); list.stream().filter(s->s.startsWith("张")).forEach(System.out::println); list.stream().filter(s->s.length()==3).forEach(System.out::println);
limit(long maxSize):截取前指定个参数个数的数据
ArrayListlist = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); list.stream().limit(3).forEach(System.out::println);
skip(long n):跳过指定个数参数
ArrayListlist = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); list.stream().skip(3).forEach(System.out::println); list.stream().skip(2).limit(2).forEach(System.out::println);
concat(Stream a,Stream b):合并两个流为一个流(静态方法,通过Stream接口名进行调用)
ArrayListlist = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); Stream s1 = list.stream().limit(4); Stream s2 = list.stream().skip(2); Stream.concat(s1,s2).forEach(System.out::println);
distinct():返回由该流中不同的元素组成的流(根据Object.equals(Object))
Streams1 = list.stream().limit(4); Stream s2 = list.stream().skip(2); Stream.concat(s1,s2).distinct().forEach(System.out::println);
sorted():自然排序 sorted(Comparator comparator):根据Comparator排序
ArrayListlist = new ArrayList<>(); list.add("linqingxia"); list.add("zhangmanyu"); list.add("wangzuxian"); list.add("liuyan"); list.add("zhangmin"); list.add("zhangwuji"); //自然排序 list.stream().sorted().forEach(System.out::println); //指定排序 // list.stream().sorted(new Comparator () { // @Override // public int compare(String o1, String o2) { // return o1.length()-o2.length(); // } // }).forEach(System.out::println); 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);
map(Function mapper):返回由指定函数应用于此流的元素的结果组成的流
Function接口中的方法 R apply(T t),接受一个T类型参数,返回一个R类型结果
ArrayListlist = new ArrayList<>(); list.add("25"); list.add("58"); list.add("24"); list.add("785"); list.add("1354"); list.add("355"); list.stream().map(Integer::parseInt).forEach(System.out::println);
mapToInt(ToIntFunction mapper):返回一个IntStream(独有方法sum())
int sum = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println("总和:"+sum);
一个流只能有一个终结操作
list.stream().filter().forEach()
常见终结操作
forEach(Consumer action):对流中的每个元素进行操作
Consumer接口中的方法 void accept(T t):对给定的参数执行操作
ArrayListlist = new ArrayList<>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); list.stream().forEach(System.out::println);
long count():返回此流中元素的个数
long count = list.stream().count();
System.out.println("元素个数为:"+count);
使用collect(Collector collector)方法
Collector接口,需要使用Collectors类来实现其功能
Collectors类软件包 java.util.stream
| static | toSet() | 返回一个 Collector ,将输入元素累加到一个新的 Set 。 |
|---|---|---|
| static | toList() | 返回一个 Collector ,将输入元素累加到一个新的 List 。 |
| static | toMap(Function super T,? extends K> keyMapper, Function super T,? extends U> valueMapper) | 返回一个 Collector ,它将元素累加到 Map其键和值是将提供的映射函数应用于输入元素的结果。两个参数,一个是key,一个是value |
Listlist1 = list.stream().limit(3).collect(Collectors.toList()); list1.forEach(System.out::println);