জাভা এসই 8 এর জোড় বা টিপলস রয়েছে?


183

আমি জাভা SE 8 অলস কার্মিক অপারেশন সঙ্গে প্রায় বাজানো এবং আমি চাই mapএকটি সূচক iএকজোড়া / tuple করতে (i, value[i]), তারপর filterদ্বিতীয় উপর ভিত্তি করে value[i]আউটপুট উপাদান, এবং পরিশেষে শুধু সূচকের।

আমি এখনও এই কষ্ট ভোগ করতে হবে: কি সি ++ জুড়ি <এল, আর> সমতুল্য জাভা কি? লাম্বদা ও স্রোতের সাহসী নতুন যুগে?

আপডেট: আমি একটি বরং সরল উদাহরণ উপস্থাপন করেছি, যার নীচের উত্তরগুলির মধ্যে @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]ম্যাপিং ছাড়াই প্রথম স্থানে?
হোলার

@ হোলগার আমাকে জানতে হবে যে কোন অ্যারের সূচকগুলিতে একটি মানদণ্ডের সাথে মিল রয়েছে এমন মান রয়েছে। আমি iপ্রবাহে সংরক্ষণ না করে এটি করতে পারি না । আমারও দরকার value[i]মানদণ্ডের জন্য। এজন্যই আমার দরকার(i, value[i])
নেক্রোমেন্সার

1
@ এনক্রোমেন্সার রাইট, এটি কেবল তখনই কাজ করে যদি সূচী থেকে কোনও অ্যারে, একটি এলোমেলো অ্যাক্সেস সংগ্রহ বা একটি সস্তা ফাংশন হিসাবে মূল্য পাওয়া সস্তা। আমি অনুমান করি যে সমস্যাটি হ'ল আপনি একটি সরল ব্যবহারের কেস উপস্থাপন করতে চেয়েছিলেন, তবে এটির ওপেন করা হয়েছে এবং এইভাবে একটি বিশেষ মামলায় আত্মহত্যা হয়েছিল।
স্টুয়ার্ট

1
@ নেকক্রোম্যান্সার আমি আপনাকে যে প্রশ্নটি জিজ্ঞাসা করছি তা স্পষ্ট করতে আমি শেষ অনুচ্ছেদটি কিছুটা সম্পাদনা করেছি। এটা কি ঠিক? এছাড়াও, এটি কোনও পরিচালক (অ্যাসাইক্লিক নয়) গ্রাফ সম্পর্কে প্রশ্ন ? (এটি খুব বেশি গুরুত্ব দেয় না)) অবশেষে, পছন্দসই আউটপুটটি হওয়া উচিত [0, 2, 4]?
স্টুয়ার্ট

1
আমি বিশ্বাস করি যে এটি সমাধানের সঠিক সমাধানটি হ'ল ভবিষ্যতের জাভা রিলিজ সাপোর্ট টিউপলগুলি রিটার্নের ধরণ হিসাবে (অবজেক্টের একটি বিশেষ কেস) হিসাবে এবং ল্যাম্বডা এক্সপ্রেশনগুলি এর পরামিতিগুলির জন্য সরাসরি এই জাতীয় টিপল ব্যবহার করতে সক্ষম হতে পারে।
থরবজর্ন রাভন অ্যান্ডারসন

উত্তর:


205

আপডেট: এই উত্তরটি মূল প্রশ্নের জবাবে, জাভা এসই 8 এর কি জোড় বা টিপলস রয়েছে? (এবং অন্তর্নিহিতভাবে, যদি না হয় তবে কেন নয়?) প্রশ্নটি আরও একটি সম্পূর্ণ উদাহরণ সহ ওপি আপডেট করেছে, তবে মনে হচ্ছে এটি কোনও ধরণের জুড়ি কাঠামো ব্যবহার না করেই সমাধান করা যেতে পারে। [ওপি থেকে দ্রষ্টব্য: এখানে অন্যান্য সঠিক উত্তর ।]


সংক্ষিপ্ত উত্তর হলো 'না'। হয় আপনাকে নিজের রোল করতে হবে বা এটি প্রয়োগ করে এমন কয়েকটি লাইব্রেরির মধ্যে একটি আনতে হবে।

Pairজাভা এসই মধ্যে একটি ক্লাস থাকার প্রস্তাব দেওয়া হয়েছিল এবং একবারে প্রত্যাখ্যান করা হয়েছিল। ওপেনজেডকে মেলিং তালিকার একটিতে এই আলোচনার থ্রেডটি দেখুন । ট্রেড অফগুলি সুস্পষ্ট নয়। একদিকে অন্যান্য লাইব্রেরিতে এবং অ্যাপ্লিকেশন কোডগুলিতে অনেকগুলি জুড়ি বাস্তবায়ন রয়েছে। এটি একটি প্রয়োজন দেখায়, এবং জাভা এসইতে এ জাতীয় শ্রেণি যুক্ত করা পুনরায় ব্যবহার এবং ভাগ করে নেবে। অন্যদিকে, একটি জোড় শ্রেণি থাকা প্রয়োজনীয় প্রকার এবং বিমূর্ততা তৈরি না করেই জোড় এবং সংগ্রহের বাইরে জটিল ডেটা স্ট্রাকচার তৈরি করার লোভকে যুক্ত করে। (এটি সেই থ্রেড থেকে কেভিন বুরিলনের বার্তার একটি প্যারাফ্রেজ )

আমি সবাইকে পুরো ইমেল থ্রেডটি পড়ার পরামর্শ দিই। এটি লক্ষণীয়ভাবে অন্তর্দৃষ্টিযুক্ত এবং এর কোনও অগ্নিসংযোগ নেই। এটা যথেষ্ট বিশ্বাসযোগ্য। এটি শুরু হওয়ার পরে আমি ভেবেছিলাম, "হ্যাঁ, জাভা এসইতে একটি জোড় ক্লাস থাকা উচিত" তবে থ্রেডটি শেষ হওয়ার সাথে সাথে আমি আমার মন পরিবর্তন করেছিলাম।

তবে খেয়াল করুন যে জাভাএফএক্স-এর javafx.util.Pair ক্লাস রয়েছে। জাভাএফএক্সের এপিআইগুলি জাভা এসই এপিআই থেকে আলাদাভাবে বিকশিত হয়েছিল।

যেহেতু লিঙ্কিত প্রশ্ন থেকে কেউ দেখতে পাচ্ছেন যে জাভার সি ++ পেয়ারের সমতুল্য কী? দৃশ্যত এমন একটি সহজ এপিআই যা ঘিরে রয়েছে বেশ বড় একটি ডিজাইনের স্পেস। অবজেক্টগুলি কি অপরিবর্তনীয় হওয়া উচিত? সেগুলি কি সিরিয়ালযোগ্য হতে হবে? তাদের তুলনা করা উচিত? ক্লাস চূড়ান্ত হওয়া উচিত নাকি? দুটি উপাদান আদেশ করা উচিত? এটি ইন্টারফেস বা শ্রেণি হওয়া উচিত? জোড়ায় থামবে কেন? ট্রিপল, কোয়াডস বা এন-টিপলস কেন নয়?

এবং অবশ্যই উপাদানগুলির জন্য বাইকশেড অনিবার্য রয়েছে:

  • (ক, খ)
  • (প্রথম সেকেন্ড)
  • (বাম ডান)
  • (গাড়ি, সিডিআর)
  • (ফু, বার)
  • প্রভৃতি

একটি বড় বিষয় যা খুব কমই উল্লেখ করা হয়েছে তা হ'ল আদিমদের সাথে জুটির সম্পর্ক। আপনার যদি এমন কোনও (int x, int y)ড্যাটাম থাকে যা 2 ডি স্পেসে একটি বিন্দু উপস্থাপন করে, এটি উপস্থাপন করে যেমন দুটি 32-বিট শব্দের পরিবর্তে তিনটি বস্তুPair<Integer, Integer> গ্রাস করে । তদুপরি, এই বিষয়গুলি অবশ্যই গাদাতে থাকা উচিত এবং এতে জিসি ওভারহেড ব্যয় করবে।

এটি স্পষ্ট বলে মনে হবে যে, স্ট্রিমগুলির মতো, এখানে জোড়গুলির জন্য আদিম বিশেষত্ব থাকা অপরিহার্য হবে। আমরা কি দেখতে চাই:

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

এমনকি একটি IntIntPairএখনও স্তূপে একটি বস্তুর প্রয়োজন হবে।

এগুলি অবশ্যই java.util.functionজাভা এসই 8 এর প্যাকেজে ফাংশনাল ইন্টারফেসগুলির প্রসারণের কথা মনে করিয়ে দেয় you আপনি যুক্তিও দিতে পারেন যে এটি যথেষ্ট নয়, এবং বলার জন্য সেই বিশেষত্বগুলিও Booleanযুক্ত করা উচিত।

আমার অনুভূতিটি হ'ল জাভা যদি অনেক আগে জোড় ক্লাস যুক্ত করে থাকে তবে এটি সহজ বা সরল ছিল, এবং আমরা এখন যেগুলি ব্যবহারের কল্পনা করছি সেগুলি সন্তুষ্ট হত না। বিবেচনা করুন যে জেডিকে ১.০ টাইম ফ্রেমে পেয়ার যুক্ত করা থাকলে এটি সম্ভবত পরিবর্তনীয় হতে পারত! (Java.util.Date দেখুন।) লোকেরা কি এতে খুশি হত? আমার ধারণাটি হ'ল জাভাতে যদি একটি জোড় শ্রেণি থাকত তবে এটি দয়ালু-বাছাই-না-সত্যিই দরকারী everybody এবং প্রত্যেকে এখনও তাদের চাহিদা পূরণের জন্য নিজস্ব ঘূর্ণায়িত হবে, বহিরাগত লাইব্রেরিতে বিভিন্ন জুড়ি এবং টুপল বাস্তবায়ন হবে, এবং জাভা জুড়ি ক্লাস কীভাবে ঠিক করা যায় সে সম্পর্কে লোকেরা তর্ক-বিতর্ক / আলোচনা করবে। অন্য কথায়, আমরা আজ যেখানে রয়েছি একই জায়গায় ধরণের।

ইতিমধ্যে, মৌলিক সমস্যাটি সমাধানের জন্য কিছু কাজ চলছে, যা মূল্য প্রকারের জন্য জেভিএম (এবং শেষ পর্যন্ত জাভা ভাষায়) আরও ভাল সমর্থন । মূল্যবোধের নথির এই রাজ্যটি দেখুন । এটি প্রাথমিক, অনুমানমূলক কাজ এবং এটি কেবল জেভিএমের দৃষ্টিকোণ থেকে বিষয়গুলি কভার করে, তবে এর পিছনে ইতিমধ্যে এর যথেষ্ট পরিমাণে চিন্তাভাবনা রয়েছে। অবশ্যই এটি জাভা 9 তে প্রবেশ করবে বা যে কোনও জায়গায় প্রবেশ করবে এমন কোনও গ্যারান্টি নেই but তবে এটি এই বিষয়টিতে ভাবনার বর্তমান দিকটি দেখায়।


3
আদিমগুলি সহ নেকক্রোমেন্সার ফ্যাক্টরি পদ্ধতিগুলি সহায়তা করে না Pair<T,U>। জেনেরিকগুলি অবশ্যই রেফারেন্স প্রকারের হতে হবে। যে কোনও আদিমগুলি সঞ্চিত হলে বক্স করা হবে। আদিমগুলি সঞ্চয় করতে আপনার সত্যিকার অর্থে আলাদা শ্রেণির প্রয়োজন।
স্টুয়ার্ট

3
@ এনক্রোমেন্সার এবং হ্যাঁ পূর্ববর্তী সময়ে বক্সযুক্ত আদিম নির্মাণকারীদের প্রকাশ্য হওয়া উচিত ছিল না এবং valueOfবক্সযুক্ত উদাহরণ পাওয়ার একমাত্র উপায় হওয়া উচিত ছিল। তবে সেগুলি জাভা ০.০ থেকে সেখানে রয়েছে এবং সম্ভবত এই মুহুর্তে পরিবর্তনের চেষ্টা করা উপযুক্ত নয়।
স্টুয়ার্ট

3
স্পষ্টতই, ব্যাকগ্রাউন্ডে স্বচ্ছভাবে প্রয়োজনীয় কারিগরীকরণ ক্লাস (অনুকূলিত স্টোরেজ সহ) তৈরির কারখানা পদ্ধতিযুক্ত একটিমাত্র পাবলিক Pairবা Tupleশ্রেণি থাকতে হবে । শেষ পর্যন্ত, ল্যাম্বডাস ঠিক তা করেন: তারা স্বেচ্ছাসেবী প্রকারের একটি স্বেচ্ছাসেবী সংখ্যার ক্যাপচার করতে পারে। এবং এখন কোনও ভাষার সহায়তার চিত্র দিন যাতে কোনও invokedynamicনির্দেশনার দ্বারা চালিত রানটাইমে উপযুক্ত টিউপল শ্রেণি তৈরি করা যায় ...
হোলার

3
@ হোলজার যদি বিদ্যমান জেভিএম-তে মূল্য প্রকারের পুনঃনির্মাণ করা হয় তবে এর মতো কিছু কাজ করতে পারে তবে মান প্রকারের প্রস্তাবনা (এখন "প্রকল্পের ভালাল্লা" ) অনেক বেশি র্যাডিক্যাল। বিশেষত, এর মান ধরণের অগত্যা গাদা-বরাদ্দ হবে না। এছাড়াও, আজকের বস্তুর মতো নয় এবং আজ আদিমগুলির মতো, মানগুলির কোনও পরিচয় থাকবে না।
স্টুয়ার্ট

2
@ স্টুয়ার্ট মার্কস: আমি যে ধরণের বর্ণনা করেছি তা হ'ল এই জাতীয় ধরণের জন্য "বক্সযুক্ত" টাইপ হতে পারে। invokedynamicল্যাম্বডা তৈরির অনুরূপ একটি ভিত্তিক কারখানার সাথে পরবর্তী সময়ে পুনঃনির্মাণগুলি কোনও সমস্যা হবে না। যাইহোক, লাম্বদাদের পাশাপাশি কোনও পরিচয় নেই। স্পষ্টতই বলা হয়েছে যে, আপনি আজ যে পরিচয়টি বুঝতে পারেন তা হ'ল বর্তমান বাস্তবায়নের একটি নিদর্শন।
হলগার

46

আপনি এই বিল্ট-ইন ক্লাসগুলিতে এক নজর দেখতে পারেন:


3
এটি জোড়গুলির জন্য অন্তর্নির্মিত কার্যকারিতা হিসাবে সঠিক উত্তর। নোট করুন যে SimpleImmutableEntryকেবলমাত্র গ্যারান্টি দেয় যে সঞ্চিত রেফারেন্সগুলি Entryপরিবর্তিত হয় না, এটি নয় যে লিঙ্কযুক্ত keyএবং valueঅবজেক্টগুলির (বা তাদের সাথে সংযুক্ত বস্তুর ক্ষেত্রগুলি ) পরিবর্তন হয় না।
লুক হাচিসন

22

দুঃখের বিষয়, জাভা 8 জোড়া বা টিপলস পরিচয় করিয়ে দেয় না। আপনি সর্বদা অবশ্যই org.apache.commons.lang3.tuple অবশ্যই ব্যবহার করতে পারেন (যা ব্যক্তিগতভাবে আমি জাভা 8 এর সাথে সম্মিলিতভাবে ব্যবহার করি) বা আপনি নিজের র‍্যাপারগুলি তৈরি করতে পারেন। অথবা মানচিত্র ব্যবহার করুন। বা এর মতো স্টাফ, যেমনটি আপনি লিঙ্ক করেছেন সেই প্রশ্নের গৃহীত উত্তরে ব্যাখ্যা করা হয়েছে।


আপডেট: জেডি কে 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]]

প্রকৃতপক্ষে @ স্টার্টমার্কের উত্তরগুলির মধ্যে একটি আমাকে টিপলস ছাড়াই এটি সমাধান করার অনুমতি দিয়েছে, তবে যেহেতু এটি সাধারণীকরণ বলে মনে হচ্ছে না শেষ পর্যন্ত আমার সম্ভবত এটির প্রয়োজন হবে।
নেক্রোমেন্সার

@ এনক্রোমেন্সার হ্যাঁ, এটি খুব ভাল উত্তর। অ্যাপাচি লাইব্রেরি এখনও সময়ে সময়ে কাজে আসতে পারে তবে এটি সমস্ত জাভাস ভাষার নকশায় নেমে আসে। মূলত, টিপলগুলি অন্যান্য ভাষায় যেমন কাজ করে তেমন আদিম (বা অনুরূপ) হতে হবে।
বেলাশাদ্রি

1
যদি আপনি এটি লক্ষ্য না করেন তবে উত্তরের মধ্যে এই অত্যন্ত তথ্যমূলক লিঙ্কটি অন্তর্ভুক্ত রয়েছে: cr.openjdk.java.net/~jrose/values/values-0.html টিউপস সহ এই ধরনের আদিমদের জন্য প্রয়োজনীয়তা এবং সম্ভাবনা সম্পর্কে।
নেক্রোমেন্সার

17

এটি প্রদর্শিত হয় যে পুরো উদাহরণটি কোনও ধরণের জুড়ি কাঠামো ব্যবহার না করেই সমাধান করা যায়। মূলটি হ'ল কলামের সূচীতে column কলামে 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]যার ফলাফলের মধ্যে আমি মনে করি যে ওপি দ্বারা সঠিক ফলাফলটি অনুরোধ করা হয়েছে।

boxed()অপারেশনটিও নোট করুন যা intমানগুলিকে Integerবস্তুগুলিতে বক্স করে । এটি একজনকে পূর্বের বিদ্যমান toList()সংগ্রাহককে তার পরিবর্তে সংগ্রাহক ফাংশনগুলি লিখে রাখে যা তাদের নিজেরাই বক্সিং করে do


1
আপনার হাতা +1 টেক্কা দিন :) এটি এখনও সাধারণ হয় না, তাই না? এটাই প্রশ্নের আরও বেশি দিক ছিল কারণ আমি অন্যান্য পরিস্থিতির মুখোমুখি হওয়ার প্রত্যাশা করি যেখানে এর মতো কোনও স্কিম কাজ করবে না (উদাহরণস্বরূপ কলামগুলি 3 টিরও বেশি মান ছাড়াই true)। তদনুসারে, আমি আপনার অন্যান্য উত্তর সঠিক হিসাবে গ্রহণ করব, তবে এটির দিকেও নির্দেশ করব! অনেক অনেক ধন্যবাদ :)
নেক্রোমেন্সার

এটি সঠিক তবে একই ব্যবহারকারীর দ্বারা অন্য উত্তর গ্রহণ করা। (উপরে এবং অন্যত্র মন্তব্য দেখুন))
নেক্রোম্যান্সার

1
@ নেক্রোমেন্সার রাইট, আপনি যে সূচকগুলি চান সে ক্ষেত্রে এই কৌশলটি সম্পূর্ণরূপে সাধারণ নয় তবে সূচকটি ব্যবহার করে ডেটা উপাদান পুনরুদ্ধার করা বা গণনা করা যায় না। (কমপক্ষে সহজেই নয়) উদাহরণস্বরূপ, এমন কোনও সমস্যা বিবেচনা করুন যেখানে আপনি কোনও নেটওয়ার্ক সংযোগ থেকে পাঠ্যের লাইনগুলি পড়ছেন এবং আপনি কিছু প্যাটার্নের সাথে মিলে Nth লাইনের লাইন নম্বরটি সন্ধান করতে চান। সবচেয়ে সহজ উপায় হ'ল লাইনগুলি সংযুক্ত করার জন্য প্রতিটি লাইনটিকে একটি জোড় বা কিছু সংমিশ্রিত ডেটা কাঠামোতে ম্যাপ করা to যদিও কোনও নতুন ডেটা কাঠামো ছাড়াই এটি করার একটি হ্যাকি, পার্শ্ব-কার্যকরী উপায় সম্ভবত রয়েছে।
স্টুয়ার্ট

@ স্টার্টমার্কস, একটি জুটি <টি, ইউ>। একটি ট্রিপল <টি, ইউ, ভি>। ইত্যাদি আপনার উদাহরণটি একটি তালিকা, একটি জুড়ি নয়।
পেসারিয়ার

7

ভ্যাভার (পূর্বে জাভাসলং নামে পরিচিত) ( http://www.vavr.io ) পাশাপাশি টিপলস (8 টির আকারের আকার) সরবরাহ করে। জাভাডোকটি এখানে: 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;

এখন পর্যন্ত জেডিকে কেন সাধারণ ধরণের টিউপস নিয়ে আসে নি তা আমার কাছে রহস্য। র‌্যাপার ক্লাস রচনা প্রতিদিনের ব্যবসা বলে মনে হচ্ছে।


ভ্যাভারের কিছু সংস্করণ হুডির নীচে ছুঁড়ে ছুঁড়ে মারছে। সেগুলি ব্যবহার না করার জন্য সাবধান হন।
থরবজর্ন রাভন অ্যান্ডারসন

7

জাভা 9 এর পরে, আপনি Map.Entryআগের তুলনায় সহজ উদাহরণ তৈরি করতে পারেন :

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

Map.entryএকটি অশোধিতযোগ্য ফেরত দেয় 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.Entryএকটি হিসাবে ব্যবহার করা যেতে পারে Pair

দুর্ভাগ্যক্রমে এটি জাভা 8 স্ট্রিমগুলির সাথে সহায়তা করে না কারণ সমস্যাটি হ'ল ল্যাম্বডাস একাধিক যুক্তি নিতে পারলেও জাভা ভাষা কেবলমাত্র একটি মান (বস্তু বা আদিম ধরণের) ফেরত দেওয়ার অনুমতি দেয়। এটি সূচিত করে যে যখনই আপনার কাছে কোনও স্ট্রিম থাকে আপনি পূর্ববর্তী ক্রিয়াকলাপ থেকে কোনও একক বস্তুটি পাস করার সাথে শেষ করেন। এটি জাভা ভাষার একটি অভাব, কারণ যদি একাধিক রিটার্ন মানগুলি সমর্থন করা হত এবং স্ট্রিমগুলি তাদের সমর্থন করে তবে আমরা স্ট্রিমগুলি দ্বারা খুব ভাল অ-তুচ্ছ কাজ করতে পারি।

ততক্ষণে, খুব কম ব্যবহার হয়।

সম্পাদনা 2018-02-12: একটি প্রকল্পে কাজ করার সময় আমি একটি সহায়ক ক্লাস লিখেছিলাম যা পরবর্তী সময়ে আপনার প্রয়োজনীয় স্ট্রিমটিতে শনাক্তকারী হওয়ার বিশেষ ক্ষেত্রে পরিচালনা করতে সহায়তা করে তবে এর মধ্যে প্রবাহের অংশটি এটি সম্পর্কে জানে না। যতক্ষণ না আমি এটির নিজের কাছে এটি প্রকাশ করতে ঘুরে আসি ততক্ষণ পর্যন্ত এটি আইডভ্যালু.জেভাতে ইউনিট পরীক্ষা সহ আইডভ্যালু.জভাতে উপলব্ধ


2

Eclipse সংগ্রহে রয়েছে Pairএবং আদিম / বস্তু জুটির সমস্ত সংমিশ্রণ (সমস্ত আটটি প্রাথমিকের জন্য)।

Tuplesকারখানার দৃষ্টান্ত তৈরি করতে পারেন Pair, এবং PrimitiveTuplesকারখানা আদিম / বস্তু যুগলের সব সমন্বয় তৈরি করতে ব্যবহার করা যেতে পারে।

জাভা 8 প্রকাশের আগে আমরা এগুলি যুক্ত করেছি। তারা আমাদের আদিম মানচিত্রগুলির জন্য কী / মান আইট্রেটারগুলি কার্যকর করতে কার্যকর ছিল, যা আমরা সমস্ত আদিম / অবজেক্ট সংমিশ্রণগুলিতেও সমর্থন করি।

যদি আপনি অতিরিক্ত লাইব্রেরি ওভারহেড যুক্ত করতে ইচ্ছুক হন তবে আপনি স্টুয়ার্টের গৃহীত সমাধানটি ব্যবহার করতে পারেন এবং IntListবক্সিং এড়ানোর জন্য ফলাফলগুলিকে আদিম হিসাবে সংগ্রহ করতে পারেন । স্ট্রিমগুলি থেকে সংগ্রহগুলি তৈরি করার অনুমতি দেওয়ার জন্য আমরা Eclipse সংগ্রহ 9.0 এ নতুন পদ্ধতি যুক্ত করেছি ।Int/Long/DoubleInt/Long/Double

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

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.