1. Stream流
感觉很像Linux里面awk,grep这种
- 生成流:list,通过数据源生成流
- 中间操作:filter,多个中间操作,打开流,对数据进行操作并返回一个新的流交给下一个操作
- 终结操作:forEach,该操作结束后,流终止
- 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流,过滤姓张,过滤长度为3,逐一打印
- Stream流把真正的函数式编程风格引入到Java中
1.1. 生成流
生成Stream流的方式
- Collection体系集合:使用默认方法stream()生成流, default Stream< E> stream()
- Map体系集合:把Map转成Set集合,间接的生成流
- 数组:通过Stream接口的静态方法of(T… values)生成流
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();
Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
//Map体系的集合间接的生成流
Map<String,Integer> map = new HashMap<String, Integer>();
Stream<String> keyStream = map.keySet().stream();
Stream<Integer> valueStream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
//数组可以通过Stream接口的静态方法of(T... values)生成流
String[] strArray = {"hello","world","java"};
Stream<String> strArrayStream = Stream.of(strArray);
Stream<String> strArrayStream2 = Stream.of("hello", "world", "java");
Stream<Integer> intStream = Stream.of(10, 20, 30);
1.2. 中间操作
方法名 | 说明 |
---|---|
Stream< T> filter(Predicate predicate) | 用于对流中的数据进行过滤 |
Stream< T> limit(long maxSize) | 返回此流中的元素组成的流,截取前指定参数个数的数据 |
Stream< T> skip(long n) | 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 |
static < T> Stream< T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream< T> distinct() | 返回由该流的不同元素(根据Object.equals(Object) )组成的流 |
Stream< T> sorted() | 返回由此流的元素组成的流,根据自然顺序排序 |
Stream< T> sorted(Comparator comparator) 返回由该流的元素组成的流,根据提供的Comparator进行排序 | |
< R> Stream< R> map(Function mapper) | 返回由给定函数应用于此流的元素的结果组成的流 |
IntStream mapToInt(ToIntFunction mapper) | 返回一个IntStream其中包含将给定函数应用于此流的元素的结果 |
public class Test {
public static void main(String[] args) {
//创建一个集合,存储多个字符串元素
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("张曼玉");
list.add("王祖贤");
list.add("柳岩");
list.add("张敏");
list.add("张无忌");
list.stream().
filter(s -> s.startsWith("张")).limit(2). //limit2 就剩下,张曼玉和张敏了.
// filter(s -> s.length() == 3).forEach(System.out::println);
skip(1).forEach(System.out::println); //skip跳过第一个.
Stream s1=list.stream().limit(3);
Stream s2=list.stream().skip(2);
int count=Stream.concat(s1,s2).distinct().count();//统计个数
System.out.println(count);
System.out.println("----");
list.stream().
// sorted().
sorted((s3, s4) ->{
int num1= s3.length()-s4.length();
int num2= num==0?s3.compareTo(s4):num;
return num2; //长度相同则,自然排序
}).//按照长度
forEach(System.out::println);
ArrayList<String> list = new ArrayList<String>();
list.add("10");
list.add("20");
list.add("30");
list.add("40");
list.add("50");
list.add("60");
list.stream().map(Integer::parseInt).forEach(System.out::println);
int sum = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(sum);
}
}
1.3. 总结操作
方法名 | 说明 |
---|---|
void forEach(Consumer action) | 对此流的每个元素执行操作 |
long count() | 返回此流中的元素数 |
1.4. 收集操作
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中.
R collect(Collector collector): 把结果收集到集合中
工具类Collectors提供了具体的收集方式
方法名 | 说明 |
---|---|
public static < T> Collector toList() | 把元素收集到List集合中 |
public static < T> Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper,Function valueMapper) | 把元素收集到Map集合中 |
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("张曼玉");
list.add("王祖贤");
list.add("柳岩");
Stream<String> listStream = list.stream().filter(s -> s.length() >= 3);
List<String> names = listStream.collect(Collectors.toList());
for (String name : names) {
System.out.println(name);
}
//定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};
//需求5:得到字符串中年龄数据大于28的流
Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28);
//需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
Map<String, Integer> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
}
}