生成流
- 通过数据源(集合,数组等)生成流
- Stream流的常见生成方式:
- Collection体系的集合可以使用默认方法stream()生成流,default Stream
stream() 。 - Map体系的集合间接生成流
- 数组可以通过Stream接口的静态方法of(T… values)生成流 ```java import java.util.*; import java.util.stream.Stream;
- Collection体系的集合可以使用默认方法stream()生成流,default Stream
public class Demo {
public static void main(String[] args) {
List
Set<String> set = new HashSet<>() ;
Stream<String> setStream = set.stream() ;
Map<String,Integer> map = new HashMap<>() ;
Stream<String> mapKeyStream = map.keySet().stream() ;
Stream<Integer> mapValueStream = map.values().stream() ;
Stream<Map.Entry<String,Integer>> entryStream = map.entrySet().stream() ;
String[] strArray = {"hello","world","java"} ;
Stream<String> strArrayStream = Stream.of(strArray) ;
Stream<String> strArrayStream2 = Stream.of("hello","world","java") ;
Stream<Integer> strArrayStream3 = Stream.of(10,20,30) ;
}
}
<a name="oSWHe"></a>
#### 中间操作
- 一个流后面可以跟随零个或者多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用。
- **_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)组成的流)0
- **_Stream<T> sorted() _** 返回此流的元素组成的流,根据自然顺序排序。
- **_Stream<T> sorted(Comparator comparator)_** 返回由该流的元素组成的流,根据提供的Comparator进行排序
- **_<R> Stream<R> map(Function mapper)_** 返回由给定函数应用于此流的元素的结果组成的流
- **_IntStream mapToInt(ToIntFunction mapper) _** 返回一个IntStream其中包含给定函数应用于此流的元素的结果;InStream表示原始的int流;ToIntFunction接口中的方法 int applyAsInt(T value)
```java
import java.util.*;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>() ;
arrayList.add("林青霞");
arrayList.add("张曼玉");
arrayList.add("王祖贤");
arrayList.add("柳岩");
arrayList.add("张敏");
arrayList.add("张无忌");
Stream<String> s1 = arrayList.stream().limit(4) ;
Stream<String> s2 = arrayList.stream().limit(2) ;
Stream.concat(s1,s2).forEach(System.out::println);
System.out.println("----------------");
//跳过前两个,再把剩下的输出
arrayList.stream().skip(2).limit(2).forEach(System.out::println);
System.out.println("----------------");
//输出姓张且名字为个字的
arrayList.stream().filter(s->s.startsWith("张"))
.filter(s -> s.length()==3).forEach(System.out::println);
}
}
import java.util.*;
import java.util.stream.Stream;
public class Demo {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>() ;
arrayList.add("林青霞");
arrayList.add("张曼玉");
arrayList.add("王祖贤");
arrayList.add("柳岩");
arrayList.add("张敏");
arrayList.add("张无忌");
arrayList.stream().sorted().forEach(System.out::println);
System.out.println("----------------");
//只按长度排序
arrayList.stream().sorted((s1,s2) -> s1.length()-s2.length()).forEach(System.out::println);
System.out.println("----------------");
//长度一致,根据名字排序
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);
}
}
运行结果:
张敏
张无忌
张曼玉
林青霞
柳岩
王祖贤
----------------
柳岩
张敏
林青霞
张曼玉
王祖贤
张无忌
----------------
张敏
柳岩
张无忌
张曼玉
林青霞
王祖贤
Process finished with exit code 0
import java.util.*;
public class Demo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>() ;
list.add("10");
list.add("20");
list.add("30");
list.add("40");
list.add("50");
list.add("60");
//将集合中的数据转成整数后输出
list.stream().map(s -> Integer.parseInt(s)).forEach(System.out::println);
int result = list.stream().mapToInt((s) -> Integer.parseInt(s)).sum();
System.out.println(result);
}
}
运行结果:
10
20
30
40
50
60
210
终结操作:
- 一个流只能有一个终结操作,当着操作执行后,流就被用“光”了,无法再被操作。所以这必定是流的最后一个操作
- void forEach(Consumer action) 对此流的每个元素执行操作
-
Stream流的收集操作
对数据使用Stream流的操作完毕后,把流中的数据收集到集合中
- R collect(Collector collector)
- 这个收集方法是一个接口
- 工具类Collector提供了具体的收集方式
- public static
Collector toList() 把元素收集到LIst集合中 - public static
Collector toSet() 把元素收集到Set集合中 - public static
Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中 ```java import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream;
- public static
public class Demo {
public static void main(String[] args) {
List
Set<Integer> set = new HashSet<>() ;
set.add(10);
set.add(20);
set.add(30);
set.add(33);
set.add(35);
//得到年龄大于25的,收集起来遍历
Set<Integer> ages = set.stream().filter(s -> s>25).collect(Collectors.toSet()) ;
for(Integer age:ages)
System.out.println(age);
String[] strArray = {"林青霞,30","张曼玉,35","王祖贤,33","柳岩,25"};
//得到字符串中年龄数据大于28的流,得到一个map集合。
Map<String,Integer> map = Stream.of(strArray)
.filter(s -> Integer.parseInt(s.split(",")[1])>28)
.collect(Collectors.toMap(s -> s.split(",")[0],
s->Integer.parseInt(s.split(",")[1])));
Set<String> keySet = map.keySet() ;
for(String key:keySet){
Integer value = map.get(key) ;
System.out.println(key+","+value);
}
}
} 运行结果: 林青霞 林志玲 王祖贤 33 35 30 林青霞,30 王祖贤,33 张曼玉,35
Process finished with exit code 0 ```