使用流

筛选和切片

筛选

// 筛选蔬菜
List vegetarianMenu = menu.stream().filter(Dish::isVegetarian).collect(toList());

排重

// 列出所有偶数排重
numbers.stream().filter(i -> i%2 ==0).distinct().forEach(...);

截断

// 取前3个成员
menu.stream().limit(3).collect(...);

跳过元素

// 跳过前2个成员
menu.stream().skip(2).collect(...);

映射

对流中每一个元素应用函数

// 提取每道菜名称的长度
menu.stream().map(Dish::getName).map(String::length).collect(...);

流的扁平化

words.stream().map(w->w.split("") // 单词转换成字母构成的数组
  .flatMap(Arrays::stream) // 扁平化 (相当于把数组拆成一个个元素,没有数组和数组之间结构之分)
  .distinct().collect(...);

查找和匹配

至少匹配一个元素

// 集合里有一个元素都满足,就返回true
if (menu.stream().anyMatch(Dish::isVegetarian)) {
  ...
}

匹配所有元素

isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000);

// 相对的,确保流中没有任何元素与给定的谓词匹配
isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000);

查找元素

// 找到流中的任意一道素菜
Optional dish = menu.stream().filter(Dish::isVegetarian).findAny();

查找第一个元素

// findFirst在并行上限制更多,findAny限制少,前提是你不关心返回的元素是哪个
someNumbers.stream().filter(x->x%3 ==0).findFirst();

归约

求和

numbers.stream().reduce(0, (a, b) -> a+b);

最大值和最小值

numbers.stream().reduce((x,y) -> x

数值流

原始类型流特化

// 数值流
// mapToInt将Stream转换成IntStrem,就可以调用特有的sum等方法了
menu.stream().mapToInt(Dish::getCalories).sum();

// boxed转化回对象流
intStream().boxed();

构建流

由值创建流

Stream stream = Stream.of("...", "...");

由数组创建流

// int数组直接转换成IntStream()
Arrays.stream(numbers).sum();

由文件生成流

Stream lines = Files.lines(Paths.get("data.txt"),Charset.defaultCharset());

你可能感兴趣的:(使用流)