生成流
- 通过数据源(集合,数组等)生成流
- 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)```javaimport 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);}}运行结果:102030405060210
终结操作:
- 一个流只能有一个终结操作,当着操作执行后,流就被用“光”了,无法再被操作。所以这必定是流的最后一个操作
- 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 ```
