Java SE 8 มีคู่หรือ Tuples หรือไม่


185

ฉันกำลังเล่นกับการทำงานที่ขี้เกียจใน Java SE 8 และฉันต้องการmapดัชนีiไปเป็นคู่ / tuple (i, value[i])จากนั้นfilterขึ้นอยู่กับvalue[i]องค์ประกอบที่สองและสุดท้ายก็ส่งออกดัชนี

ฉันต้องยังคงประสบกับสิ่งนี้: อะไรคือสิ่งที่เทียบเท่าของ C ++ Pair <L, R> ใน Java? ในยุคใหม่ที่กล้าหาญของ lambdas และลำธาร?

อัปเดต:ฉันนำเสนอตัวอย่างที่ค่อนข้างง่ายซึ่งมีโซลูชันที่นำเสนออย่างประณีตโดย @dkatzel ในหนึ่งในคำตอบด้านล่าง อย่างไรก็ตามมันไม่ได้พูดคุยกัน ดังนั้นให้ฉันเพิ่มตัวอย่างทั่วไปมากขึ้น:

package com.example.test;

import java.util.ArrayList;
import java.util.stream.IntStream;

public class Main {

  public static void main(String[] args) {
    boolean [][] directed_acyclic_graph = new boolean[][]{
        {false,  true, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false,  true, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false,  true},
        {false, false, false, false, false, false}
    };

    System.out.println(
        IntStream.range(0, directed_acyclic_graph.length)
        .parallel()
        .mapToLong(i -> IntStream.range(0, directed_acyclic_graph[i].length)
            .filter(j -> directed_acyclic_graph[j][i])
            .count()
        )
        .filter(n -> n == 0)
        .collect(() -> new ArrayList<Long>(), (c, e) -> c.add(e), (c1, c2) -> c1.addAll(c2))
    );
  }

}

นี้จะช่วยให้ไม่ถูกต้องการส่งออกของ[0, 0, 0]ซึ่งสอดคล้องกับการนับfalseสำหรับคอลัมน์ที่สามที่มีทั้งหมด สิ่งที่ฉันต้องการคือดัชนีของคอลัมน์ทั้งสามนี้ [0, 2, 4]เอาท์พุทที่ถูกต้องควรจะเป็น ฉันจะรับผลลัพธ์นี้ได้อย่างไร


2
มีAbstractMap.SimpleImmutableEntry<K,V>มาหลายปีแล้ว… แต่อย่างไรก็ตามแทนที่จะทำแผนที่iเพื่อ(i, value[i])กรองโดยvalue[i]และทำแผนที่ย้อนกลับไปที่i: ทำไมไม่กรองเฉพาะvalue[i]ในตอนแรกโดยไม่มีแผนที่
Holger

@ Holger ฉันจำเป็นต้องรู้ว่าดัชนีใดของอาร์เรย์ที่มีค่าที่ตรงกับเกณฑ์ ฉันไม่สามารถทำได้โดยไม่รักษาไว้iในสายน้ำ ฉันยังต้องการvalue[i]เกณฑ์ นั่นเป็นเหตุผลที่ฉันต้องการ(i, value[i])
หมอผี

1
@necromancer ถูกต้องใช้งานได้ก็ต่อเมื่อราคาถูกกว่าเพื่อรับค่าจากดัชนีเช่นอาร์เรย์ชุดการเข้าถึงแบบสุ่มหรือฟังก์ชันราคาไม่แพง ฉันเดาว่าปัญหาคือคุณต้องการที่จะนำเสนอกรณีการใช้งานที่ง่ายขึ้น แต่มันก็ง่ายเกินไปและยอมจำนนต่อกรณีพิเศษ
Stuart Marks

1
@necromancer ฉันแก้ไขย่อหน้าสุดท้ายเล็กน้อยเพื่อชี้แจงคำถามที่ฉันคิดว่าคุณถาม ถูกต้องหรือไม่ นอกจากนี้คำถามนี้เกี่ยวกับกราฟกำกับ (ไม่ใช่ acyclic) หรือไม่ (ไม่ใช่ว่ามันสำคัญมาก) สุดท้ายผลลัพธ์ที่ต้องการควรเป็น[0, 2, 4]อย่างไร
Stuart Marks

1
ฉันเชื่อว่าทางออกที่ถูกต้องในการแก้ไขปัญหานี้คือมีการสนับสนุน Java รีลีส tuples ในอนาคตเป็นชนิดส่งคืน (เป็นกรณีพิเศษของ Object) และมีการแสดงออกแลมบ์ดาสามารถใช้ tuple ดังกล่าวได้โดยตรงสำหรับพารามิเตอร์
Thorbjørn Ravn Andersen

คำตอบ:


206

UPDATE:คำตอบนี้เป็นการตอบคำถามเดิมJava SE 8 มีคู่หรือ Tuples หรือไม่? (และโดยปริยายถ้าไม่ใช่ทำไมไม่?) OP ได้อัปเดตคำถามด้วยตัวอย่างที่สมบูรณ์มากขึ้น แต่ดูเหมือนว่ามันจะสามารถแก้ไขได้โดยไม่ต้องใช้โครงสร้าง Pair ใด ๆ [หมายเหตุจาก OP: นี่คือคำตอบที่ถูกต้องอื่น ๆ ]


คำตอบสั้น ๆ คือไม่ คุณต้องม้วนตัวเองหรือนำหนึ่งในหลาย ๆ ไลบรารีที่นำมาใช้

มีPairคลาสใน Java SE ถูกเสนอและปฏิเสธอย่างน้อยหนึ่งครั้ง ดูหัวข้อสนทนานี้ในหนึ่งในรายชื่อผู้รับจดหมาย OpenJDK การแลกเปลี่ยนไม่ชัดเจน ในอีกด้านหนึ่งมีการใช้งาน Pair มากมายในไลบรารี่อื่นและในโค้ดแอปพลิเคชัน นั่นแสดงให้เห็นถึงความต้องการและการเพิ่มคลาสดังกล่าวใน Java SE จะเพิ่มการใช้ซ้ำและการแบ่งปัน ในทางกลับกันการมีคลาส Pair เพิ่มการล่อลวงในการสร้างโครงสร้างข้อมูลที่ซับซ้อนจากคู่และคอลเลกชันโดยไม่ต้องสร้างประเภทและบทคัดย่อที่จำเป็น (นั่นเป็นการถอดความข้อความของKevin Bourillionจากหัวข้อนั้น)

ฉันขอแนะนำให้ทุกคนอ่านกระทู้อีเมลทั้งหมด มันฉลาดอย่างน่าทึ่งและไม่มีความเสียหาย มันค่อนข้างน่าเชื่อถือ เมื่อมันเริ่มฉันคิดว่า "ใช่ควรจะมีคลาส Pair ใน Java SE" แต่เมื่อถึงเวลาที่เธรดจะสิ้นสุดฉันก็เปลี่ยนใจ

โปรดทราบว่า JavaFX มีคลาสjavafx.util.Pair API ของ JavaFX วิวัฒนาการมาแยกจาก Java SE API

อย่างที่เราเห็นได้จากคำถามที่เชื่อมโยงอะไรคือคู่ของ C ++ Pair ใน Java? มีพื้นที่การออกแบบค่อนข้างใหญ่โดยรอบสิ่งที่เห็นได้ชัดคือ API อย่างง่าย วัตถุควรจะไม่เปลี่ยนรูปหรือไม่ ควรจะเป็นแบบอนุกรมหรือไม่ พวกเขาควรจะเทียบเคียง? ชั้นเรียนควรจะเป็นที่สิ้นสุดหรือไม่? ควรสั่งทั้งสององค์ประกอบหรือไม่ มันควรจะเป็นอินเทอร์เฟซหรือคลาสหรือไม่ หยุดที่คู่ทำไม ทำไมไม่ลองเล่นสามคนสี่คนหรือ N-tuples ล่ะ?

และแน่นอนว่ามีการตั้งชื่อ bikeshed สำหรับองค์ประกอบ:

  • (a, b)
  • (ครั้งแรกที่สอง)
  • (ซ้ายขวา)
  • (รถยนต์, cdr)
  • (foo บาร์)
  • เป็นต้น

ประเด็นสำคัญข้อหนึ่งที่แทบจะไม่ได้กล่าวถึงคือความสัมพันธ์ของคู่กับสิ่งดั้งเดิม หากคุณมี(int x, int y)ตัวเลขที่แสดงถึงจุดในพื้นที่ 2 มิติการแสดงสิ่งนี้เป็นการPair<Integer, Integer>ใช้วัตถุสามชิ้นแทนคำ 32 บิตสองคำ นอกจากนี้วัตถุเหล่านี้จะต้องอยู่บนกองและจะมีค่าใช้จ่าย GC

ดูเหมือนจะชัดเจนว่าเช่นสตรีมมันเป็นสิ่งจำเป็นที่จะต้องมีความเชี่ยวชาญดั้งเดิมสำหรับคู่ เราต้องการดู:

Pair
ObjIntPair
ObjLongPair
ObjDoublePair
IntObjPair
IntIntPair
IntLongPair
IntDoublePair
LongObjPair
LongIntPair
LongLongPair
LongDoublePair
DoubleObjPair
DoubleIntPair
DoubleLongPair
DoubleDoublePair

แม้แต่IntIntPairวัตถุยังต้องการวัตถุหนึ่งบนกอง

แน่นอนว่าสิ่งเหล่านี้ทำให้นึกถึงการเพิ่มขึ้นของอินเทอร์เฟซการทำงานในjava.util.functionแพ็คเกจใน Java SE 8 หากคุณไม่ต้องการ API แบบ bloated สิ่งที่คุณจะทิ้งไว้? คุณอาจโต้เถียงว่าสิ่งนี้ยังไม่เพียงพอและBooleanควรเพิ่มความเชี่ยวชาญเฉพาะด้านเช่นกัน

ความรู้สึกของฉันคือถ้า Java ได้เพิ่มคลาส Pair นานมาแล้วมันอาจจะง่ายหรือแม้แต่เรียบง่ายและมันก็จะไม่เป็นที่พอใจกับกรณีการใช้งานหลายอย่างที่เรามองเห็นในตอนนี้ พิจารณาว่าถ้า Pair ถูกเพิ่มเข้ามาในกรอบเวลาของ JDK 1.0 มันอาจจะไม่แน่นอน! (ดูที่ java.util.Date.) ผู้คนจะมีความสุขกับสิ่งนั้นหรือไม่? ฉันเดาว่าถ้ามีคลาส Pair ใน Java จะเป็น kinda-sort-not- ไม่เป็นประโยชน์จริง ๆ และทุกคนจะยังคงกลิ้งของตัวเองเพื่อตอบสนองความต้องการของพวกเขาจะมีการใช้งาน Pair และ Tuple ในไลบรารีภายนอก และผู้คนก็ยังคงเถียงกัน / พูดคุยเกี่ยวกับวิธีการแก้ไขคลาส Pair ของ Java กล่าวอีกอย่างหนึ่งก็คือเราอยู่ในที่เดียวกัน

ในขณะเดียวกันการทำงานบางอย่างที่เกิดขึ้นเพื่อแก้ไขปัญหาพื้นฐานซึ่งเป็นการสนับสนุนที่ดีใน JVM (และในที่สุดภาษา Java) สำหรับประเภทค่า ดูเอกสารสถานะของค่านี้ นี่เป็นงานเบื้องต้นงานเก็งกำไรและครอบคลุมเฉพาะประเด็นจากมุมมอง JVM แต่มีความคิดอยู่เบื้องหลังพอสมควร แน่นอนไม่มีการรับประกันว่าสิ่งนี้จะเข้าสู่ Java 9 หรือเข้าที่ใดก็ได้ แต่มันแสดงให้เห็นทิศทางของการคิดในปัจจุบันในหัวข้อนี้


3
วิธีการ @necromancer Pair<T,U>โรงงานที่มีพื้นฐานไม่ช่วยเหลือ เนื่องจากข้อมูลทั่วไปจะต้องเป็นประเภทอ้างอิง primitives ใด ๆ จะได้รับกล่องเมื่อพวกเขาถูกเก็บไว้ ในการจัดเก็บดั้งเดิมคุณต้องมีคลาสที่แตกต่างกัน
สจวร์ตมาร์ค

3
@necromancer และใช่เมื่อมองย้อนกลับไปตัวสร้างดั้งเดิมแบบกล่องไม่ควรเป็นแบบสาธารณะและvalueOfควรเป็นวิธีเดียวที่จะได้รับอินสแตนซ์แบบกล่อง แต่สิ่งเหล่านั้นอยู่ในนั้นตั้งแต่ Java 1.0 และอาจไม่คุ้มค่าที่จะพยายามเปลี่ยนแปลง ณ จุดนี้
สจวร์ตมาร์ค

3
เห็นได้ชัดว่าควรมีเพียงหนึ่งสาธารณะPairหรือTupleคลาสที่มีวิธีการจากโรงงานสร้างคลาสความเชี่ยวชาญที่จำเป็น ในท้ายที่สุดแลมบ์ดาทำสิ่งนั้นอย่างแน่นอนพวกเขาอาจจับตัวแปรตามอำเภอใจได้หลายประเภท และตอนนี้ภาพการสนับสนุนภาษาช่วยให้การสร้างชั้น tuple ที่เหมาะสมที่รันไทม์เรียกโดยinvokedynamicการเรียนการสอน ...
โฮล

3
@ โฮลเกอร์บางอย่างเช่นนี้อาจใช้งานได้หากมีการปรับเปลี่ยนประเภทของค่าลงใน JVM ที่มีอยู่ แต่ข้อเสนอประเภทค่า (ตอนนี้"Project Valhalla" ) นั้นมีความรุนแรงมากกว่า โดยเฉพาะอย่างยิ่งชนิดของค่าจะไม่จำเป็นต้องจัดสรรฮีป นอกจากนี้ไม่เหมือนวัตถุในปัจจุบันและเช่นเดียวกับสิ่งพื้นฐานในปัจจุบันคุณค่าจะไม่มีตัวตน
Stuart Marks

2
@Stuart Marks: นั่นจะไม่รบกวนเนื่องจากชนิดที่ฉันอธิบายอาจเป็นชนิด“ ชนิดบรรจุกล่อง” สำหรับประเภทค่าดังกล่าว ด้วยinvokedynamicโรงงานที่มีพื้นฐานคล้ายกับการสร้างแลมบ์ดาการติดตั้งเพิ่มเติมในภายหลังเช่นนี้จะไม่มีปัญหา โดยวิธีการ lambdas ไม่มีตัวตนเช่นกัน ตามที่ระบุไว้อย่างชัดเจนข้อมูลประจำตัวที่คุณอาจรับรู้ในวันนี้เป็นสิ่งประดิษฐ์ของการใช้งานปัจจุบัน
Holger

46

คุณสามารถดูคลาสที่มีอยู่ภายในเหล่านี้ได้:


3
นี่คือคำตอบที่ถูกต้องเท่าที่มีอยู่แล้วในการทำงานสำหรับคู่ โปรดทราบว่าSimpleImmutableEntryเพียงรับประกันว่าการอ้างอิงที่เก็บไว้ในEntryไม่เปลี่ยนแปลงไม่ใช่ว่าเขตข้อมูลของการเชื่อมโยงkeyและvalueวัตถุ (หรือของวัตถุที่พวกเขาเชื่อมโยงไป) จะไม่เปลี่ยนแปลง
ลุคฮัทชิสัน

22

น่าเสียดายที่ Java 8 ไม่ได้แนะนำคู่หรือสิ่งอันดับ คุณสามารถใช้org.apache.commons.lang3.tuple ได้ตลอดเวลา (ซึ่งโดยส่วนตัวฉันใช้ร่วมกับ Java 8) หรือคุณสามารถสร้าง wrappers ของคุณเองได้ หรือใช้ Maps หรืออะไรทำนองนั้นตามที่อธิบายไว้ในคำตอบที่ยอมรับสำหรับคำถามที่คุณเชื่อมโยง


UPDATE: JDK 14 กำลังแนะนำระเบียนเป็นคุณลักษณะแสดงตัวอย่าง สิ่งเหล่านี้ไม่ใช่สิ่งอันดับ แต่สามารถใช้เพื่อบันทึกปัญหาเดียวกันหลายประการ ในตัวอย่างเฉพาะของคุณจากด้านบนอาจมีลักษณะดังนี้:

public class Jdk14Example {
    record CountForIndex(int index, long count) {}

    public static void main(String[] args) {
        boolean [][] directed_acyclic_graph = new boolean[][]{
                {false,  true, false,  true, false,  true},
                {false, false, false,  true, false,  true},
                {false, false, false,  true, false,  true},
                {false, false, false, false, false,  true},
                {false, false, false, false, false,  true},
                {false, false, false, false, false, false}
        };

        System.out.println(
                IntStream.range(0, directed_acyclic_graph.length)
                        .parallel()
                        .mapToObj(i -> {
                            long count = IntStream.range(0, directed_acyclic_graph[i].length)
                                            .filter(j -> directed_acyclic_graph[j][i])
                                            .count();
                            return new CountForIndex(i, count);
                        }
                        )
                        .filter(n -> n.count == 0)
                        .collect(() -> new ArrayList<CountForIndex>(), (c, e) -> c.add(e), (c1, c2) -> c1.addAll(c2))
        );
    }
}

เมื่อคอมไพล์และรันด้วยJDK 14 (ณ เวลาที่เขียนนี่เป็นการสร้างการเข้าถึงก่อนหน้า) โดยใช้--enable-previewแฟล็กคุณจะได้รับผลลัพธ์ต่อไปนี้:

[CountForIndex[index=0, count=0], CountForIndex[index=2, count=0], CountForIndex[index=4, count=0]]

จริงๆแล้วหนึ่งในคำตอบของ @StuartMarks ช่วยให้ฉันแก้ปัญหาได้โดยไม่ต้องมี tuples แต่เนื่องจากดูเหมือนว่ามันไม่ได้พูดคุยกันโดยทั่วไปฉันอาจต้องใช้มันในที่สุด
หมอผี

@ หมอผีใช่มันเป็นคำตอบที่ดีมาก ห้องสมุดอาปาเช่ยังคงมีประโยชน์ในบางครั้ง แต่ทุกอย่างก็มาจากการออกแบบภาษา Javas โดยทั่วไปสิ่งอันดับจะต้องเป็นสิ่งพื้นฐาน (หรือคล้ายกัน) เพื่อทำงานตามที่พวกเขาทำในภาษาอื่น
blalasaadri

1
ในกรณีที่คุณไม่ได้สังเกตเห็นคำตอบนั้นรวมลิงค์ข้อมูลที่มีประโยชน์อย่างยิ่งนี้: cr.openjdk.java.net/~jrose/values/values-0.htmlเกี่ยวกับความต้องการและโอกาสสำหรับสิ่งดั้งเดิมเช่นทูเปิล
หมอผี

17

ปรากฏว่าตัวอย่างทั้งหมดสามารถแก้ไขได้โดยไม่ต้องใช้โครงสร้าง Pair ใด ๆ กุญแจสำคัญคือการกรองในดัชนีคอลัมน์ด้วยเพรดิเคตตรวจสอบคอลัมน์ทั้งหมดแทนการแมปดัชนีคอลัมน์กับจำนวนfalseรายการในคอลัมน์นั้น

รหัสที่ทำนี่คือที่นี่:

    System.out.println(
        IntStream.range(0, acyclic_graph.length)
            .filter(i -> IntStream.range(0, acyclic_graph.length)
                                  .noneMatch(j -> acyclic_graph[j][i]))
            .boxed()
            .collect(toList()));

ผลลัพธ์นี้เป็นผลลัพธ์[0, 2, 4]ซึ่งฉันคิดว่าผลลัพธ์ที่ถูกต้องที่ร้องขอโดย OP

นอกจากนี้ยังทราบการboxed()ดำเนินการที่กล่องintค่าลงในIntegerวัตถุ สิ่งนี้ทำให้ผู้ใช้สามารถใช้ตัวtoList()สะสมที่มีอยู่แล้วแทนที่จะต้องเขียนฟังก์ชันตัวสะสมที่ทำมวยเอง


1
+1 เอซขึ้นแขนของคุณ :) นี่ยังไม่เป็นเรื่องปกติใช่มั้ย นั่นเป็นประเด็นที่เป็นรูปธรรมมากขึ้นเพราะฉันคาดหวังว่าจะเผชิญกับสถานการณ์อื่น ๆ ที่รูปแบบเช่นนี้ใช้ไม่ได้ (เช่นคอลัมน์ที่มีค่าไม่เกิน 3 ค่าtrue) ดังนั้นฉันจะยอมรับคำตอบอื่น ๆ ของคุณว่าถูกต้อง แต่ให้ชี้ไปที่คำตอบนี้! ขอบคุณมาก :)
หมอผี

นี้ถูกต้อง แต่ยอมรับคำตอบอื่น ๆ โดยผู้ใช้รายเดียวกัน (ดูความคิดเห็นด้านบนและที่อื่น ๆ )
หมอผี

1
@necromancer ถูกต้องเทคนิคนี้ไม่ได้เป็นแบบทั่วไปอย่างสมบูรณ์ในกรณีที่คุณต้องการดัชนี แต่องค์ประกอบข้อมูลไม่สามารถเรียกคืนหรือคำนวณได้โดยใช้ดัชนี (อย่างน้อยก็ไม่สะดวก) ตัวอย่างเช่นพิจารณาปัญหาที่คุณกำลังอ่านบรรทัดข้อความจากการเชื่อมต่อเครือข่ายและคุณต้องการค้นหาหมายเลขบรรทัดของบรรทัด Nth ที่ตรงกับรูปแบบบางอย่าง วิธีที่ง่ายที่สุดคือการแมปแต่ละบรรทัดเป็นคู่หรือโครงสร้างข้อมูลคอมโพสิตบางอย่างเพื่อกำหนดหมายเลขบรรทัด อาจเป็นวิธีที่แฮ็กและมีผลข้างเคียงในการทำเช่นนี้โดยไม่มีโครงสร้างข้อมูลใหม่
Stuart Marks

@ StuartMarks ทั้งคู่คือ <T, U> สาม <T, U, V> เป็นต้นตัวอย่างของคุณคือรายการไม่ใช่คู่
Pacerier

7

Vavr (เดิมชื่อ Javaslang) ( http://www.vavr.io ) มี tuples (ขนาด til เท่ากับ 8) เช่นกัน นี่คือ Javadoc นี้: https://static.javadoc.io/io.vavr/vavr/0.9.0/io/vavr/Tuple.html

นี่คือตัวอย่างง่ายๆ:

Tuple2<Integer, String> entry = Tuple.of(1, "A");

Integer key = entry._1;
String value = entry._2;

ทำไม JDK เองถึงไม่มาพร้อมกับ tuples แบบง่าย ๆ ตอนนี้เป็นเรื่องลึกลับสำหรับฉัน การเขียนคลาส wrapper ดูเหมือนจะเป็นธุรกิจทุกวัน


บางรุ่นของ vavr ใช้ส่อเสียดพ่นใต้กระโปรงหน้ารถ ระวังอย่าใช้มัน
Thorbjørn Ravn Andersen

7

ตั้งแต่ Java 9 คุณสามารถสร้างอินสแตนซ์Map.Entryได้ง่ายกว่าที่เคยมีมา:

Entry<Integer, String> pair = Map.entry(1, "a");

Map.entryส่งคืนค่า unmodifiable Entryและห้ามเป็นโมฆะ


6

เนื่องจากคุณสนใจเฉพาะดัชนีคุณจึงไม่จำเป็นต้องแมปกับสิ่งอันดับเลย ทำไมไม่เพียงเขียนตัวกรองที่ใช้องค์ประกอบค้นหาในอาร์เรย์ของคุณ

     int[] value =  ...


IntStream.range(0, value.length)
            .filter(i -> value[i] > 30)  //or whatever filter you want
            .forEach(i -> System.out.println(i));

+1 สำหรับโซลูชันที่ยอดเยี่ยมและใช้งานได้จริง อย่างไรก็ตามฉันไม่แน่ใจว่าจะพูดคุยกับสถานการณ์ของฉันที่ฉันสร้างค่าได้ทันทีหรือไม่ ฉันตั้งคำถามของฉันเป็นอาร์เรย์เพื่อเสนอกรณีง่าย ๆ ที่จะคิดถึงและคุณคิดหาวิธีแก้ปัญหาที่ยอดเยี่ยม
หมอผี

5

ใช่.

Map.EntryPairสามารถนำมาใช้เป็น

น่าเสียดายที่มันไม่ได้ช่วยสตรีม Java 8 เนื่องจากปัญหาคือแม้ว่า lambdas สามารถรับอาร์กิวเมนต์ได้หลายภาษา แต่ภาษา Java อนุญาตให้ส่งคืนค่าเดียวเท่านั้น (วัตถุหรือชนิดดั้งเดิม) นี่ก็หมายความว่าเมื่อใดก็ตามที่คุณมีกระแสคุณท้ายด้วยการผ่านวัตถุเดียวจากการดำเนินการก่อนหน้านี้ นี่คือการขาดในภาษาจาวาเพราะถ้าหลายค่าตอบแทนได้รับการสนับสนุนและกระแสสนับสนุนพวกเขาเราอาจมีงานที่ไม่ใช่เรื่องเล็ก ๆ น้อย ๆ ที่ทำโดยลำธาร

จนกว่าจะถึงวันนั้นจะมีการใช้เพียงเล็กน้อยเท่านั้น

แก้ไข 2018-02-12: ในขณะที่ทำงานในโครงการฉันเขียนคลาสผู้ช่วยเหลือซึ่งช่วยจัดการกรณีพิเศษของการมีตัวระบุก่อนหน้านี้ในสตรีมที่คุณต้องการในภายหลัง แต่ส่วนสตรีมในระหว่างไม่ทราบเกี่ยวกับเรื่องนี้ จนกว่าฉันจะได้รับการปล่อยตัวด้วยตัวมันเองก็มีให้ที่IdValue.javaด้วยการทดสอบหน่วยที่IdValueTest.java


2

Eclipse Collections มีPairและการรวมกันของคู่ดั้งเดิม / วัตถุคู่ (สำหรับทั้งแปดดั้งเดิม)

Tuplesโรงงานสามารถสร้างอินสแตนซ์PairและPrimitiveTuplesโรงงานสามารถใช้ในการสร้างชุดทั้งหมดของดั้งเดิม / คู่วัตถุ

เราเพิ่มสิ่งเหล่านี้ก่อนที่จะปล่อย Java 8 มันมีประโยชน์ในการใช้ Iterators คีย์ / ค่าสำหรับแผนที่ดั้งเดิมของเราซึ่งเรายังสนับสนุนในการรวมกันของวัตถุ / ดั้งเดิมทั้งหมด

หากคุณยินดีที่จะเพิ่มค่าใช้จ่ายห้องสมุดพิเศษคุณสามารถใช้วิธีการแก้ปัญหาที่ได้รับการยอมรับของ Stuart และรวบรวมผลลัพธ์เป็นแบบดั้งเดิมIntListเพื่อหลีกเลี่ยงการชกมวย เราได้เพิ่มวิธีการใหม่ในEclipse Collections 9.0เพื่ออนุญาตให้Int/Long/Doubleสร้างคอลเลกชันจากInt/Long/DoubleStreams

IntList list = IntLists.mutable.withAll(intStream);

หมายเหตุ: ฉันเป็นคอมมิชชันสำหรับ Eclipse Collections

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.