Stream

  • 流不存储元素;它们存储在底层的集合或者按需生成;
  • 流操作不改变它们的源数据;例如filter方法不会从一个新流中删除元素,而是生成一个不包含特定元素的新流;
  • Stream操作可能是延迟执行的;
  • 和迭代器类似,流只能遍历一次
  • filter和map等操作是无状态的,它们并不存储任何状态。reduce等操作要存储状态才能计算出一个值。sorted和distinct等操作也要存储状态,因为它们需要把流中的所有元素缓存起来才能返回一个新的流。这种操作称为有状态操作

支持两种类型操作:

  • 中间操作(如filter或map)
  • 终端操作(如count、findFirst、forEach和reduce)

常用API

  • IntStream.rangeClosed(1, 100):rangeClosed方法来生成1到100之间的所有数字
  • Stream.of:显式值创建一个流
  • Stream.empty():创建一个空流
  • Arrays.stream(numbers):从数组创建一个流

外部迭代与内部迭代

使用Collection接口需要用户去做迭代(比如用for-each),这称为外部迭代

Streams库使用内部迭代——它帮你把迭代做了,还把得到的流值存在了某个地方,你只要给出一个函数说要干什么就可以了

API

Stream操作 描述
filter filter转换生成一个匹配一定条件的新流过滤
mapToXXX 使用toXXXFunction对流中的元素执行一对一的转换,该方法返回的新流中包含了toXXXFunction转换生成的所有元素;
forEach 迭代
count 统计
map 将流中的值进行某种转换
reduce 归约操作
generate 接受一个无参数的函数
iterate iterate方法接受一个"种子"值和一个函数并对之前的值重复应用该函数
limit 返回一个包含n个元素的新流
skip 跳过或丢弃前n个元素
toArray 返回一个数组
collect 收集
concat 连接两个流
distinct 过滤重复元素
sorted 排序
peek 每当检索元素的时候就会调用一次(可用来调试流)
max 取最大值
min 取最小值
findFirst 返回非空集合中的第一个值
findAny 返回任何一个匹配的元素
anyMatch 返回是否含有匹配元素
flatMap flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接起来成为一个流

Method

Stream<String> stream = Stream.of("1,2,3,4,10".split(","));
Arrays.stream("h,2,34,3".split(",")).forEach(System.err::println);

// Stream<Double> stm = Stream.generate(Math::random).limit(10); // 如果没有limit流会一直运行
Stream<String> stm = Stream.generate(() -> "hello").limit(10);

Pattern.compile("\\PL+").splitAsStream("hello,world").forEach(System.err::println);

CodeList

Runnable run = () -> System.out.println("running...”); ##不带参数
ActionListener action = event -> System.err.println("button click”); ##带参数
Runnable run = () -> { ##代码块
System.out.println("running...");
System.err.println("end");
return;
};
IntSummaryStatistics summaryStatistics = list.stream().mapToInt(e -> e.intValue()).summaryStatistics(); //统计
方法引用:System.out::println(语法:Classname::method)

常见用法

// 打印输出
list.stream().forEach(System.err::println);

// 过滤
list.stream().filter(t -> t > 50).forEach(System.out::println);

// 排序
list.stream().sorted((x1, x2) -> x2.compareTo(x1)).forEach(System.err::println);

// 求总记录数
System.err.println(list.stream().count());

// 转换为Map
Map<String, TerraOrderBill> billMap = orderBillList.stream().collect(
    Collectors.toMap(TerraOrderBill::getBillId,bill -> bill));

// 求和
double totalAmount = seEntries.stream().mapToDouble(t -> t.getRealPayAmount()).sum();

// distinct
recordEntrys.stream().filter(t -> !StringUtils.isEmpty(t.getSupplierId()))
    .map(SettlementRecordEntry::getSupplierId).distinct().collect(Collectors.toList());

// 并行处理
sum = list.parallelStream().mapToInt(t -> t.intValue()).sum();

results matching ""

    No results matching ""