java流操作

一、流的创建

1.1 由值创建流

//由值创建流
Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream.empty();
//流构造器
Stream.<Integer>builder()
.add(1)
     .add(2)
     .add(3)
     .build(); 

1.2 由数组、列表、文件创建

//由数组创建流
Stream<String> arrayStream =  Arrays.stream(strs);
//由列表创建流
Stream<String> listStream =  list.stream();
//由文件创建
Stream<String> fileStream = Files.lines(Path.of("D:\\1.txt"));

1.3 由函数创建

//生成
Stream.generate(Math::random);
//迭代
Stream.iterate(1,n->n+1);
IntStream.range(1,5);
Stream.iterate(1,n->n+1).skip(5).limit(5);

二、流操作

2.1 基础操作

Distinct

中间操作,通过检查equals()方法返回由不同元素组成的流。

Filter

中间操作,返回与指定谓词匹配的流。

flatMap

中间操作,生成流扁平化。

Limit

中间操作,按数字截断流。

Map

中间操作,对流执行一对一映射

Peek

peek方法返回由该流的元素组成的流,并对每个元素执行所提供的 Consumer操作方法。

Skip

中间操作,丢弃前n个元素并返回剩余流。如果此流包含少于请求的流,则返回空流。

Sorted

中间操作,根据自然顺序或指定的比较器对流进行排序。对于有序流,排序是稳定的。

allMatch

终端操作,如果流中的所有元素都匹配指定的谓词,则返回true,否则返回false。如果流为空,则返回true

anyMatch

终端操作,如果流中的任何元素与指定的谓词匹配,则返回true,否则返回false。如果流为空,则返回false

findAny

终端操作,返回流中的任何元素。返回空流的一个空的Optional对象。

findFirst

终端操作,返回流的第一个元素。对于有序流,它返回第一个元素;对于无序流,它返回任何元素。

noneMatch

终端操作,如果流中没有元素匹配指定的谓词,则返回true,否则返回false。如果流为空,则返回true。

forEach

终端操作,对流中的每个元素应用操作。

Reduce

终端操作,应用缩减操作以从流计算单个值。

Max,min,average,count

终端操作

2.2 规约操作

收集器

<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
<R,A> R collect(Collector<?  super T,A,R> collector)

收集器中的Collector类由工具类Collectors生成,Collectors中生成Collectors的函数如下图

2.2.1 流转换

collectingAndThen(Collector<T,A,R> downstream, Function<R,RR>  finisher)

mapping(Function<?superT,?extendsU>mapper, Collector<?superU,A,R>downstream)

reducing(BinaryOperator<T>op)

例子

2.2.2 分组

partitioningBy(Predicate<? super T> predicate)
partitioningBy(Predicate<? super T> predicate,  Collector<? super T,A,D> downstream)

groupingBy(Function<? super  T,?  extends K>  classifier)
groupingBy(Function<? super  T,?  extends K>  classifier,  Collector<? super T,A,D> downstream)
groupingBy(Function<? super  T,?  extends K>  classifier, Supplier<M>  mapFactory, Collector<? super T,A,D> downstream)

举例:

2.2.3 连接

joining()
连接所有元素

joining(CharSequence delimiter)
使用在两个元素之间使用的分隔符。

joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
使用分隔符,前缀和后缀。 前缀将添加到开头,后缀将添加到结尾。

举例:

2.2.4 收集器

toCollection(Supplier<C>collectionFactory)

toList()

toSet()

toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M>  mapSupplier)

举例:

2.2.5 流统计

counting()

minBy(Comparator<?superT>comparator)

maxBy(Comparator<?superT>comparator)

summingInt(ToIntFunction<?superT>mapper)

summingLong(ToLongFunction<?superT>mapper)

summingDouble(ToDoubleFunction<?superT>mapper)

averagingInt(ToIntFunction<?superT>mapper)

averagingLong(ToLongFunction<?superT>mapper)

averagingDouble(ToDoubleFunction<?superT>mapper)

DoubleSummaryStatistics

LongSummaryStatistics

IntSummaryStatistics

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java管道是一种特殊的I/O,它允许两个线程之间进行单向通信。一个线程可以将数据写入管道,另一个线程可以从管道中读取数据。Java管道通过一个管道输入和一个管道输出来实现。 以下是Java管道的基本操作: 1. 创建管道:使用Pipe类的静态方法open()创建管道,该方法返回一个Pipe对象,其中包含管道输入和管道输出。 ``` Pipe pipe = Pipe.open(); ``` 2. 获取管道输入和输出:使用Pipe对象的方法获取管道输入和输出。 ``` Pipe.SourceChannel sourceChannel = pipe.source(); Pipe.SinkChannel sinkChannel = pipe.sink(); ``` 3. 向管道输出中写入数据:使用管道输出的write()方法向管道中写入数据。 ``` sinkChannel.write(ByteBuffer.wrap("Hello, World!".getBytes())); ``` 4. 从管道输入中读取数据:使用管道输入的read()方法从管道中读取数据。 ``` ByteBuffer buffer = ByteBuffer.allocate(1024); sourceChannel.read(buffer); ``` 完整的Java管道示例: ``` import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; public class PipeExample { public static void main(String[] args) throws IOException { // 创建管道 Pipe pipe = Pipe.open(); // 获取管道输入和输出 Pipe.SourceChannel sourceChannel = pipe.source(); Pipe.SinkChannel sinkChannel = pipe.sink(); // 向管道输出中写入数据 sinkChannel.write(ByteBuffer.wrap("Hello, World!".getBytes())); // 从管道输入中读取数据 ByteBuffer buffer = ByteBuffer.allocate(1024); sourceChannel.read(buffer); System.out.println(new String(buffer.array()).trim()); } } ``` 运行结果: ``` Hello, World! ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值