ITPub博客

首页 > 应用开发 > C/C++ > 游戏陪玩系统开发,Java怎样实现流合并?

游戏陪玩系统开发,Java怎样实现流合并?

C/C++ 作者:云豹科技程序员 时间:2021-11-23 16:06:36 0 删除 编辑

在很多互联网程序开发时,都需要实现不同流的合并,游戏陪玩系统开发中也不例外,那么为了提升系统的开发质量,我们应该如何实现流合并呢?

普通Java方法

JDK 8 Stream 类有一些有用的静态方法。比如concat():

合并两个流

@Test 
public void merge() { 
    Stream<Integer> stream1 = Stream.of(1, 3, 5); 
    Stream<Integer> stream2 = Stream.of(2, 4, 6); 
    
    Stream<Integer> resultingStream = Stream.concat(stream1, stream2); 
    
    assertEquals( 
        Arrays.asList(1, 3, 5, 2, 4, 6), 
        resultingStream.collect(Collectors.toList())); }

合并多个流

当我们要合并游戏陪玩系统开发中的多个流时,操作会变得复杂一些。一个可行的办法是,先合并前两个流,再用合并结果合并其他的流。
比如:

@Test 
public void merge() { 
    Stream<Integer> stream1 = Stream.of(1, 3, 5); 
    Stream<Integer> stream2 = Stream.of(2, 4, 6); 
    Stream<Integer> stream3 = Stream.of(18, 15, 36);
    
    Stream<Integer> resultingStream = Stream.concat( 
       Stream.concat(stream1, stream2), stream3);
    
    assertEquals( 
        Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36),
        resultingStream.collect(Collectors.toList())); }

这种方法对于游戏陪玩系统开发中更多的流变得不可行。当然,我们可以创建中间变量或辅助方法以使其更具可读性,但我们还有更好的办法:

@Test 
public void merge() { 
    Stream<Integer> stream1 = Stream.of(1, 3, 5); 
    Stream<Integer> stream2 = Stream.of(2, 4, 6); 
    Stream<Integer> stream3 = Stream.of(18, 15, 36); 
    Stream<Integer> stream4 = Stream.of(99); 
    
    Stream<Integer> resultingStream = Stream.of( 
        stream1, stream2, stream3, stream4) 
        .flatMap(i -> i); 
    assertEquals( 
        Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), 
        resultingStream.collect(Collectors.toList())); }

它经过两个步骤:

  • 首先创建一个包含 4 个 Streams 的新 Stream,生成嵌套的流 Stream
  • 然后我们使用恒等函数将它 flatMap() 转换为 Stream

使用 StreamEx

StreamEx 是一个开源 Java 库,它扩展了 Java 8 Streams 的可能性。它使用 StreamEx 类作为对 JDK 的 Stream 接口的增强。

合并流

StreamEx 库允许我们使用 append() 实例方法合并流:

@Test 
public void merge() { 
    Stream<Integer> stream1 = Stream.of(1, 3, 5); 
    Stream<Integer> stream2 = Stream.of(2, 4, 6); 
    Stream<Integer> stream3 = Stream.of(18, 15, 36); 
    Stream<Integer> stream4 = Stream.of(99); 
    
    Stream<Integer> resultingStream = StreamEx.of(stream1) 
        .append(stream2) 
        .append(stream3) 
        .append(stream4); 
    
    assertEquals( 
        Arrays.asList(1, 3, 5, 2, 4, 6, 18, 15, 36, 99), 
        resultingStream.collect(Collectors.toList())); }

由于它是一个实例方法,我们可以轻松地将它链接起来并附加多个 streams。

使用prepend()合并流

StreamEx 还包含一个方法,该方法在另一个之前添加元素,称为 prepend():

@Test 
public void merge() { 
    Stream<String> stream1 = Stream.of("foo", "bar");
    Stream<String> openingBracketStream = Stream.of("[");
    Stream<String> closingBracketStream = Stream.of("]");
    
    Stream<String> resultingStream = StreamEx.of(stream1) 
        .append(closingBracketStream) 
        .prepend(openingBracketStream); 
    
    assertEquals( 
        Arrays.asList("[", "foo", "bar", "]"), 
        resultingStream.collect(Collectors.toList())); }

使用Jooλ

jooλ是JDK 8兼容库,可为JDK提供有用的扩展。此处最重要的流抽象称为 SEQ。请注意,这是一个顺序和有序的流,因此调用 parallel() 将没有效果。

合并流

和StreamEx库一样,jooλ也有append()方法:

@Test 
public void merge() { 
    Stream<Integer> seq1 = Stream.of(1, 3, 5); 
    Stream<Integer> seq2 = Stream.of(2, 4, 6); 
    Stream<Integer> resultingSeq = Seq.ofType(seq1, Integer.class) 
        .append(seq2); 
    assertEquals( 
        Arrays.asList(1, 3, 5, 2, 4, 6), 
        resultingSeq.collect(Collectors.toList())); }

使用prepend()合并流

@Test 
public void merge() { 
    Stream<String> seq = Stream.of("foo", "bar");
    Stream<String> openingBracketStream = Stream.of("[");
    Stream<String> closingBracketStream = Stream.of("]");
    
    Stream<String> resultingStream = Seq.ofType(seq, String.class)
        .append(closingBracketStream) 
        .prepend(openingBracketStream); 
    
    assertEquals( 
        Arrays.asList("[", "foo", "bar", "]"), 
        resultingStream.collect(Collectors.toList())); }

总结

可以看出来在游戏陪玩系统开发中合并两个流的时候使用 JDK 8 比较简单方便,但当游戏陪玩系统开发需要多个流合并时,使用SteamEx或JOOλ库可以通过append()的方式追加流,可读性更高。

本文转载自网络,转载仅为分享干货知识,如有侵权欢迎联系云豹科技进行删除处理
原文链接:


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69996194/viewspace-2843679/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2021-03-10

  • 博文量
    308
  • 访问量
    90062