Java之Stream流
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java之Stream流相关的知识,希望对你有一定的参考价值。
本文主要介绍了Stream流,包括集合和数组的Stream流创建方式,List和Set集合直接使用stream()方法创建,Map集合间接使用stream()方法创建,而数组使用Stream流的静态方法of()创建,介绍了Stream流的中间操作,包括过滤filter(),限制limit()和跳过skip(),拼接concat)(),去重distinct(),排序sorted()等,最后介绍了Stream流的终结操作forEach()和count(),也给出Stream流的收集操作方法和综合练习。
目录
8、Stream流的常用终结操作符forEach与count
1、一个案例体验Stream流
import java.util.ArrayList;
public class StreamDemo01
public static void main(String[] args)
ArrayList<String> arrayList = new ArrayList<>() ;
arrayList.add("张无忌") ;
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("张三丰");
arrayList.add("刘小明");
//找出姓张且名字为3个字的打印输出
arrayList.stream().filter(s->s.length()==3).filter(s->s.startsWith("张")).forEach(System.out::println);
2、Stream流的常见生成方式
import java.util.*;
import java.util.stream.Stream;
public class StreamDemo02
public static void main(String[] args)
//Collection体系的默认使用stream()方法生成流
List<String> list = new ArrayList<>() ;
Stream<String> stream1 = list.stream() ;
Set<String> set = new TreeSet<>() ;
Stream<String> stream2 = list.stream() ;
//Map集合使用间接的方式生成
Map<String,Integer> map = new HashMap<>() ;
Stream<String> stream3 = map.keySet().stream() ;
Stream<Integer> stream4 = map.values().stream() ;
Stream<Map.Entry<String,Integer>> stream5 = map.entrySet().stream() ;
//数组通过Stream的静态方法of()生成流
String [] arr = "java","python","c++" ;
Stream<String> stream6 = Stream.of(arr) ;
Stream<String> stream7 = Stream.of("java","python","c++") ;
Stream<Integer> stream8 = Stream.of(10,20,30) ;
3、Stream流的中间操作之filter
import java.util.ArrayList;
import java.util.List;
public class StreamDemo03
public static void main(String[] args)
List<String> list = new ArrayList<>() ;
list.add("张三");
list.add("张无忌") ;
list.add("孙小美") ;
list.add("王五") ;
list.add("张三丰") ;
//找出姓张的并输出
list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);
System.out.println("-------------");
//找出名字长度为3的输出
list.stream().filter(s->s.length()==3).forEach(s-> System.out.println(s));
System.out.println("-------------");
//找出姓张且名字长度为3的输出
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
4、Stream流之中间操作limit与skip
import java.util.ArrayList;
import java.util.List;
public class StreamDemo04
public static void main(String[] args)
List<String> list = new ArrayList<>() ;
list.add("张三");
list.add("张无忌") ;
list.add("孙小美") ;
list.add("王五") ;
list.add("张三丰") ;
//取前面三个元素打印
list.stream().limit(3).forEach(System.out::println);
System.out.println("-------------");
//跳过两个元素,打印剩下的
list.stream().skip(2).forEach(System.out::println);
System.out.println("-------------");
//跳过2个元素,剩余元素中打印前2个
list.stream().skip(2).limit(2).forEach(s-> System.out.println(s));
5、Stream流中间操作之concat与distinct
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo05
public static void main(String[] args) List<String> list = new ArrayList<>() ;
list.add("张三");
list.add("张无忌") ;
list.add("孙小美") ;
list.add("王五") ;
list.add("张三丰") ;
//取前面4个元素
Stream<String> s1 = list.stream().limit(4) ;
//跳过两个元素
Stream<String> s2 = list.stream().skip(2) ;
//合并 前面两个并输出
// Stream.concat(s1,s2).forEach(System.out::println);
// System.out.println("-------------");
//合并前面两个,去重后输出
Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s));
6、Stream流之中间操作sorted
import java.util.ArrayList;
import java.util.Comparator;
public class StreamDemo06
public static void main(String[] args)
ArrayList<String> arrayList = new ArrayList<>() ;
arrayList.add("zhangsan") ;
arrayList.add("lisi") ;
arrayList.add("wangwu") ;
arrayList.add("malu") ;
arrayList.add("liaoxiang") ;
arrayList.stream().sorted((s1,s2)->
int num1 = s1.length() -s2.length() ;
int num2 = num1==0 ? s1.compareTo(s2) : num1 ;
return num2 ;
).forEach(System.out::println);
System.out.println("----------------");
arrayList.stream().sorted(new Comparator<String>()
@Override
public int compare(String s1, String s2)
int num1 = s1.length() -s2.length() ;
int num2 = num1==0 ? s1.compareTo(s2) : num1 ;
return num2 ;
).forEach(s-> System.out.println(s));
7、Stream之中间操作map与mapToInt
import java.util.ArrayList;
public class StreamDemo07
public static void main(String[] args)
ArrayList<String> arrayList = new ArrayList<>() ;
arrayList.add("10") ;
arrayList.add("20") ;
arrayList.add("30") ;
//集合元素转换成整数后输出
arrayList.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
//集合元素转换成整数求和输出
int sum = arrayList.stream().mapToInt(Integer::parseInt).sum() ;
System.out.println(sum);
8、Stream流的常用终结操作符forEach与count
import java.util.ArrayList;
import java.util.List;
public class StreamDemo08
public static void main(String[] args)
List<String> list = new ArrayList<>() ;
list.add("张三");
list.add("张无忌") ;
list.add("孙小美") ;
list.add("王五") ;
list.add("张三丰") ;
//统计集合中张开头的元素个数
long cnt = list.stream().filter(s->s.startsWith("张")).count() ;
System.out.println(cnt);
//输出集合元素
list.stream().forEach(System.out::println);
9、Stream流的收集操作(将流中数据收集到集合中)
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamDemo09
public static void main(String[] args)
List<String> list = new ArrayList<>() ;
list.add("张三") ;
list.add("李四") ;
list.add("王五子") ;
Stream<String> stream1 = list.stream().filter(s->s.length()==2) ;
List<String> list1 = stream1.collect(Collectors.toList()) ; //收集操作
for(String s : list1)
System.out.println(s);
System.out.println("---------------");
Set<Integer> set = new TreeSet<>() ;
set.add(10) ;
set.add(20) ;
set.add(30) ;
Stream<Integer> stream2 = set.stream().filter(s->s>=20) ;
Set<Integer>set1 = stream2.collect(Collectors.toSet()) ;
for(Integer i : set1)
System.out.println(i);
System.out.println("---------------");
String [] arr = "张三,20","李四,19","王五,21" ;
//得到年龄大于等于20的流
Stream<String> stream3 = Stream.of(arr).filter(s->Integer.parseInt(s.split(",")[1])>=20) ;
Map<String,Integer> map = stream3.collect(Collectors.toMap(s->s.split(",")[0],s->Integer.parseInt(s.split(",")[1]))) ;
for(String key : map.keySet())
System.out.println(key + ":" + map.get(key));
10、Stream流综合练习
public class Actor
private String name ;
public Actor(String name)
this.name = name;
public String getName()
return name;
public void setName(String name)
this.name = name;
import java.util.ArrayList;
import java.util.stream.Stream;
public class StreamDemo10
public static void main(String[] args)
ArrayList<String> arrayList1 = new ArrayList<>() ;
arrayList1.add("周伯通") ;
arrayList1.add("杨过") ;
arrayList1.add("郭靖") ;
arrayList1.add("张无忌") ;
arrayList1.add("张三丰") ;
ArrayList<String> arrayList2 = new ArrayList<>() ;
arrayList2.add("林龙女") ;
arrayList2.add("林黛玉") ;
arrayList2.add("林学苑") ;
arrayList2.add("薛宝钗") ;
arrayList2.add("林大美") ;
//男的只要名字为三个字的
Stream<String> s1 = arrayList1.stream().filter(s->s.length()==3) ;
//女的只要姓林的,并且不要第一个
Stream<String> s2 = arrayList2.stream().skip(1).filter(s->s.startsWith("林")) ;
//过滤后的男女名字合并到一起
Stream<String> s3 = Stream.concat(s1,s2) ;
//将上一步的操作作为构造方法的参数创建对象,遍历数据
s3.map(Actor::new).forEach(s-> System.out.println(s.getName()));
以上是关于Java之Stream流的主要内容,如果未能解决你的问题,请参考以下文章