Stream流的生成方式
Collection
体系的集合可以使用默认方法stream()
生成流 default Stream stream()Map
体系的集合间接生成流
Map<String, Integer> map = new HashMap<>();
Stream<String> mapStream = map.keySet().stream();
Stream<Integer> mapstream = map.values().stream();
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
- 数组可以通过Stream接口的静态方法`of(T…values)生成流
String[] arr = {"hello", "world", "java"};
Stream<String> arrStrem = Stream.of(arr);
Stream<String> arrstrem = Stream.of("hello", "world");
Stream<Integer> arrStrem2 = Stream.of(10, 20, 30);
Stream流常见的中间操作方法
Stream<T> filter(Predicate pre)
:用于对流中的数据进行过滤- Predicate接口中的方法为:
boolean test(T t)
,判断,并返回一个布尔值
- 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()
:返回由该流的不同元素Stream<T> sorted()
:返回由此流的元素组成的流,自然排序Stream<T> sorted(Comparator com)
:返回由该刘的元素组成的流,根据提供的比较器排序<R> Stream<R> map(Function mapper)
:返回由给定函数应用于此流的元素的结果组层的流- Function接口中的方法:R apply(T t)
IntStream mapToInt(ToIntFuction mapper)
:返回一个IntStream其中包含将给定函数应用于此流的元素的结果- IntStream:表示原始int流
- ToIntFunction接口中的方法:int applyAsInt(T value)
arr.stream().filter(str->str.startsWith("J")).forEach(System.out::println);
arr.stream().limit(2).forEach(System.out::println);
arr.stream().skip(2).limit(1).forEach(System.out::println);
// -----------------------
arr.concat(s1, s2).distinct()
// 按照字母顺序输出 arr.stream().sorted().forEach(System.out::println);
// 按照字符串长度输出
arr.stream().sorted((s1, s2) -> {
int num = s1.length() - s2.length();
int res = num == 0 ? s1.compareTo(s2) : num;
return res;
}).forEach(System.out::println);
// 将集合中的字符串转为int
list.stream().map(s->Integer.parseInt(s)).forEach(System.out::println);
list.stream().map(Integer::parseInt).forEach(System.out::println);
list.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
//返回流中的总和
int sum = list.stream().mapToInt(Integer::parseInt).sum();
System.out.println(sum);
Stream流的收集操作
收集方法
R collect(Collector collector)
工具类Collectors提供了具体收集方法- public static <T> Collector
toList()
- …toSet()
- …toMap(Function keymapperm, Function valueMapper)
public class MystreamDemo6 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("林青霞");
list.add("张敏");
list.add("林心如");
list.add("刘岩");
list.add("林志玲");
// 得到名字为三个字的流
Stream<String> nameStream = list.stream().filter(name -> name.length() == 3);
// 把流里的数据收集到集合
List<String> names = nameStream.collect(Collectors.toList());
System.out.println(names);
Set<Integer> set = new HashSet<Integer>();
set.add(33);
set.add(29);
set.add(26);
set.add(30);
set.add(40);
// age > 30
Stream<Integer> ageStream = set.stream().filter(age -> age > 30);
Set<Integer> ages = ageStream.collect(Collectors.toSet());
System.out.println(ages);
String[] arr = {"林青霞,40","张敏,38","林志玲,41"};
// age>40
Stream<String> arrStream = Stream.of(arr).filter(str -> Integer.parseInt(str.split(",")[1]) > 40);
//把上面的收集到map集合中
Map<String, Integer> collect = arrStream.collect(Collectors.toMap(str -> str.split(",")[0], str -> Integer.parseInt(str.split(",")[1])));
System.out.println(collect);
}
}