遊戲陪玩系統開發,Java怎樣實現流合併?

雲豹科技程式設計師發表於2021-11-23

在很多網際網路程式開發時,都需要實現不同流的合併,遊戲陪玩系統開發中也不例外,那麼為了提升系統的開發質量,我們應該如何實現流合併呢?

普通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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章