জাভা 8-তে মানচিত্র () এবং ফ্ল্যাটম্যাপ () পদ্ধতির মধ্যে পার্থক্য কী?


704

জাভা 8-এ Stream.map()এবং Stream.flatMap()পদ্ধতির মধ্যে পার্থক্য কী ?


55
টাইপ স্বাক্ষর কিন্ডা পুরো গল্পটি বলে। map :: Stream T -> (T -> R) -> Stream R, flatMap :: Stream T -> (T -> Stream R) -> Stream R
ক্রিস মার্টিন

97
কিন্তু, এই ধরনের স্বাক্ষর এমনকি জাভা মত দেখাচ্ছে না। (আমি জানি, আমি জানি - তবে এটি বলতে পুরো গল্পটি বলে দেয় "রিআর্ট ম্যাপ / ফ্ল্যাটম্যাপ নতুন এবং উন্নত" জাভা ++ "সম্পর্কে প্রচুর জ্ঞান অনুমান করে)
মাইকেল 25

16
@ মাইকেল এই ধরণের স্বাক্ষরটি জাভায় নয় হাস্কেলের মতো দেখাচ্ছে কিন্তু এটা পরিষ্কার না কিনা প্রকৃত জাভা স্বাক্ষর আর পাঠযোগ্য: <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
স্টুয়ার্ট

7
হা, হ্যাঁ, আমি "আসল জাভা" উল্লেখ করছি। সি ++ এর মতো, আধুনিক জাভা 90 এর দশকে (যেহেতু আমি উভয় ভাষায় করেছি) এটি ব্যবহার শুরু করে এমন যে কোনও ব্যক্তির কাছে প্রায় অচেনা। কেবলমাত্র মন্তব্যে জবাব দেওয়ার সাথে, সেই পদ্ধতিতে স্বাক্ষর করে খুব কমই কোনও "পুরো গল্প" বলা হয়, কমপক্ষে আর নয়, অতিরিক্ত প্রকাশ ছাড়াও নয় (বা সেই মন্তব্যকারীদের ক্ষেত্রে, অনুবাদে)।
মাইকেল 25

2
কোনটা বলা, একটি হল mapএর ম্যাপার ল্যামডা আয় R, একটি flatMap'র ম্যাপার ল্যামডা আয় একটি Streamএর R( Stream<R>)। flatMapএর ম্যাপার দ্বারা ফিরে আসা স্ট্রিমগুলি কার্যকরভাবে কনটেনেটেড। অন্যথায়, উভয় mapএবং flatMapফিরে Stream<R>; পার্থক্যটি হ'ল ম্যাপার ল্যাম্বডাস ফিরে আসে, Rবনাম Stream<R>
ডেরেকম

উত্তর:


813

উভয় mapএবং এ flatMapপ্রয়োগ করা যেতে পারে Stream<T>এবং তারা উভয় একটি ফিরে আসে Stream<R>। পার্থক্যটি হ'ল mapঅপারেশন প্রতিটি ইনপুট মানের জন্য একটি আউটপুট মান উত্পাদন করে , অপারেশন প্রতিটি ইনপুট মানের জন্য flatMapএকটি স্বেচ্ছাসেবী সংখ্যা (শূন্য বা আরও) মান উত্পাদন করে।

এটি প্রতিটি ক্রিয়াকলাপের যুক্তিগুলিতে প্রতিফলিত হয়।

mapঅপারেশন লাগে Functionযা ইনপুট স্ট্রিম প্রতিটি মানের জন্য বলা হয়, এবং এক ফলাফলের মান, যা আউটপুট স্ট্রিম পাঠানো হয় উৎপন্ন হয়।

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

সাধারণ ব্যবহারটি শূন্য মানগুলি প্রেরণ করতে চাইলে flatMapফিরে আসার ম্যাপার ফাংশনটির জন্য Stream.empty(), বা Stream.of(a, b, c)এটি বেশ কয়েকটি মান ফেরত দিতে চাইলে এমন কিছু। তবে অবশ্যই যে কোনও স্রোত ফিরে আসতে পারে।


26
আমার কাছে মনে হচ্ছে flatMapঅপারেশনটি ফ্ল্যাটের ঠিক বিপরীত। তবুও আবার কম্পিউটার বিজ্ঞানীদের কাছে এটিকে একটি শর্তটি শিরোনামে রেখে দিন। কোনও ফাংশন যেমন "স্বচ্ছ" হওয়ার অর্থ এটি আপনি কিছুই দেখতে পাচ্ছেন না, কেবল ফলাফলগুলি, যখন কথোপকথনে বলা হয় যে আপনি একটি প্রক্রিয়া স্বচ্ছ হতে চান মানে আপনি চান তার প্রতিটি অংশই দেখা উচিত।
18:57

44
@ কোলাডিক্ট এটিকে অন্য দৃষ্টিকোণ থেকে দেখার চেষ্টা করুন: এটি স্বচ্ছ ক্ষেত্রে নয় যেখানে আপনি অভ্যন্তরীণ কাজগুলি দেখতে পাচ্ছেন, তবে পুরো কাজটিই স্বচ্ছ, অর্থাত্ অদৃশ্য you - এখনও তাদের কাজ করার সময় এবং আপনাকে কী দেখার সুযোগ দেয় আপনি ' সঙ্গে কাজ আবার। এই ক্ষেত্রে, "ফ্ল্যাট" "নেস্টেড" এর বিপরীতকে বোঝায়, ফ্ল্যাটম্যাপ চ্যাপ্টা করে নীড়ের একটি স্তর সরিয়ে দেয়।
জেফিরো

7
@ কোলাডিক্ট "স্বচ্ছ" জিনিসটি বছরের পর বছর ধরে আমার মাথা খাচ্ছে। কমপক্ষে অন্য একজন ব্যক্তিরও একইরকম অনুভূতি জেনে আনন্দিত।
অশোক বিজয় দেবনাথ

9
একক স্তর গঠন মধ্যে 2-স্তরের গঠন বাঁক থেকে সমরূপতার আসে, Dici এর উত্তর উদাহরণের জন্য দেখতে stackoverflow.com/a/26684582/6012102
andrzej.szmukala

26
এটি ফ্ল্যাটম্যাপের সেরা ব্যাখ্যা । এটি এটিকে সমস্ত ক্লিক করে তোলে: ম্যাপার দ্বারা ফিরিয়ে দেওয়া প্রবাহের মানগুলি স্ট্রিম থেকে সঞ্চিত হয় এবং আউটপুট স্ট্রিমে প্রেরণ করা হয়। ম্যাপার ফাংশনে প্রতিটি কল দ্বারা ফিরে আসা মানের "ক্লাম্পস" আউটপুট প্রবাহে মোটেই আলাদা হয় না, সুতরাং আউটপুটটিকে "সমতল" বলা হয় । ধন্যবাদ!
neevek

463

Stream.flatMapএটির নামের দ্বারা যেমন অনুমান করা যায়, এটি হ'ল এক mapএবং flatঅপারেশনের সংমিশ্রণ । এর অর্থ হ'ল আপনি প্রথমে আপনার উপাদানগুলিতে কোনও ফাংশন প্রয়োগ করুন এবং তারপরে এটি সমতল করুন। Stream.mapস্ট্রিমটিকে সমতল না করে কেবল স্ট্রিমটিতে একটি ফাংশন প্রয়োগ করে।

কোন স্রোতে চ্যাপ্টা কী তা বোঝার জন্য , এমন একটি কাঠামো বিবেচনা করুন [ [1,2,3],[4,5,6],[7,8,9] ]যার "দুটি স্তর" রয়েছে। সমরূপতার "ওয়ান স্তর" কাঠামো এটি রূপান্তর অর্থাৎ [ 1,2,3,4,5,6,7,8,9 ]


5
সরল এবং মিষ্টি
bluelurker

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

1
এটি কীভাবে গৃহীত উত্তর নয়, সরাসরি
বক্তব্যটি

231

আরও ব্যবহারিক দৃষ্টিভঙ্গি পেতে আমি 2 টি উদাহরণ দিতে চাই :
প্রথম উদাহরণ মানচিত্রের ব্যবহার করা:

@Test
public void convertStringToUpperCaseStreams() {
    List<String> collected = Stream.of("a", "b", "hello") // Stream of String 
            .map(String::toUpperCase) // Returns a stream consisting of the results of applying the given function to the elements of this stream.
            .collect(Collectors.toList());
    assertEquals(asList("A", "B", "HELLO"), collected);
}   

প্রথম উদাহরণে বিশেষ কিছু নয়, বড় হাতের অক্ষরে Functionফিরে আসার জন্য একটি প্রয়োগ করা হয় String

দ্বিতীয় উদাহরণ ব্যবহার করে flatMap:

@Test
public void testflatMap() throws Exception {
    List<Integer> together = Stream.of(asList(1, 2), asList(3, 4)) // Stream of List<Integer>
            .flatMap(List::stream)
            .map(integer -> integer + 1)
            .collect(Collectors.toList());
    assertEquals(asList(2, 3, 4, 5), together);
}

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


@ প্রশান্তদেববাদ্বর আমি মনে করি আপনি একটি স্ট্রিমের Stream<Integer>চেয়ে বরং স্ট্রিম দিয়ে শেষ করবেন Integer
পেইন

165

একটি পরিষ্কার ধারণা পেতে দয়া করে পোস্টটি সম্পূর্ণরূপে যান,

ফ্ল্যাটম্যাপ বনাম মানচিত্র:

একটি তালিকা থেকে প্রতিটি শব্দের দৈর্ঘ্য ফেরত পেতে, আমরা নীচের মতো কিছু করব ..

সংক্ষিপ্ত সংস্করণ নীচে দেওয়া হয়েছে

যখন আমরা দুটি তালিকা সংগ্রহ করি, নীচে দেওয়া

সমতল মানচিত্র ছাড়াই => [1,2], [1,1] => [[1,2], [1,1]] এখানে দুটি তালিকার একটি তালিকার ভিতরে রাখা হয়েছে, সুতরাং আউটপুট তালিকাগুলি তালিকাযুক্ত থাকবে

সঙ্গে ফ্ল্যাট মানচিত্র => [1,2], [1,1] => [1,2,1,1] এখানে দুটি তালিকা চ্যাপ্টা করা হয় এবং শুধুমাত্র মান তালিকা মধ্যে স্থাপন করা হয়, তাই আউটপুট শুধুমাত্র উপাদান ধারণকারী তালিকা হতে হবে

মূলত এটি সমস্ত বস্তুকে এক সাথে একীভূত করে

## বিস্তারিত সংস্করণ নীচে দেওয়া হয়েছে: -

উদাহরণস্বরূপ: -
একটি তালিকা বিবেচনা করুন ["স্ট্যাক", "ওওভিভার"] এবং আমরা [["স্ট্যাকোভার"] এর মতো একটি তালিকা ফেরত দেওয়ার চেষ্টা করছি (সেই তালিকা থেকে কেবল অনন্য অক্ষর ফিরিয়ে দিচ্ছি ) প্রাথমিকভাবে, আমরা নীচে ফিরে আসার মতো কিছু করব তালিকা [ "STACKOVER"] থেকে [ "স্ট্যাক", "OOOVVVER"]

public class WordMap {
  public static void main(String[] args) {
    List<String> lst = Arrays.asList("STACK","OOOVER");
    lst.stream().map(w->w.split("")).distinct().collect(Collectors.toList());
  }
}

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

চিত্র A:

এখানে চিত্র বর্ণনা লিখুন

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

String[] arrayOfWords = {"STACK", "OOOVVVER"};
Stream<String> streamOfWords = Arrays.stream(arrayOfWords);
streamOfWords.map(s->s.split("")) //Converting word in to array of letters
    .map(Arrays::stream).distinct() //Make array in to separate stream
    .collect(Collectors.toList());

উপরেরটি এখনও কাজ করে না, কারণ আমরা এখন স্ট্রিমগুলির একটি তালিকা দিয়ে শেষ করেছি (আরও সুনির্দিষ্টভাবে স্ট্রিম>), পরিবর্তে, আমাদের প্রথমে প্রতিটি শব্দ পৃথক অক্ষরের অ্যারে রূপান্তর করতে হবে এবং তারপরে প্রতিটি অ্যারে পৃথক স্ট্রিমে রূপান্তরিত করতে হবে

ফ্ল্যাটম্যাপ ব্যবহার করে আমাদের নীচের মতো এই সমস্যাটি সমাধান করতে সক্ষম হওয়া উচিত:

String[] arrayOfWords = {"STACK", "OOOVVVER"};
Stream<String> streamOfWords = Arrays.stream(arrayOfWords);
streamOfWords.map(s->s.split("")) //Converting word in to array of letters
    .flatMap(Arrays::stream).distinct() //flattens each generated stream in to a single stream
    .collect(Collectors.toList());

ফ্ল্যাটম্যাপ স্ট্রিমের সাথে নয় বরং সেই স্ট্রিমের বিষয়বস্তু দিয়ে প্রতিটি অ্যারে ম্যাপিং সম্পাদন করবে। মানচিত্র (অ্যারে :: স্ট্রিম) ব্যবহার করার সময় যে সমস্ত স্বতন্ত্র স্ট্রিম উত্পন্ন হবে সেগুলির সমস্তই একক স্ট্রিমে মিশে গেছে। চিত্র বি ফ্ল্যাটম্যাপ পদ্ধতি ব্যবহারের প্রভাব চিত্রিত করে। চিত্র এ-তে কোন মানচিত্রটি এটির সাথে তুলনা করুন Figure এখানে চিত্র বর্ণনা লিখুন

ফ্ল্যাটম্যাপ পদ্ধতি আপনাকে স্ট্রিমের প্রতিটি মানকে অন্য স্ট্রিমের সাথে প্রতিস্থাপন করতে দেয় এবং তারপরে সমস্ত উত্পন্ন স্ট্রিমগুলিকে একক স্ট্রিমের সাথে যুক্ত করে।


2
চমৎকার চিত্রের ব্যাখ্যা।
হিতেশ

106

একটি পংক্তির উত্তর: flatMapএকটি চেপ্টা করতে সাহায্য করে Collection<Collection<T>>একটি মধ্যেCollection<T> । একই ভাবে, এটি একটি চেপ্টা হবে Optional<Optional<T>>মধ্যে Optional<T>

এখানে চিত্র বর্ণনা লিখুন

আপনি map()কেবল দেখতে পাবেন :

  • অন্তর্বর্তী টাইপ হয় Stream<List<Item>>
  • রিটার্ন টাইপ হয় List<List<Item>>

এবং সাথে flatMap():

  • অন্তর্বর্তী টাইপ হয় Stream<Item>
  • রিটার্ন টাইপ হয় List<Item>

নীচে ব্যবহার করা কোড থেকে এটি পরীক্ষার ফলাফল :

-------- Without flatMap() -------------------------------
     collect() returns: [[Laptop, Phone], [Mouse, Keyboard]]

-------- With flatMap() ----------------------------------
     collect() returns: [Laptop, Phone, Mouse, Keyboard]

কোড ব্যবহৃত :

import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

public class Parcel {
  String name;
  List<String> items;

  public Parcel(String name, String... items) {
    this.name = name;
    this.items = Arrays.asList(items);
  }

  public List<String> getItems() {
    return items;
  }

  public static void main(String[] args) {
    Parcel amazon = new Parcel("amazon", "Laptop", "Phone");
    Parcel ebay = new Parcel("ebay", "Mouse", "Keyboard");
    List<Parcel> parcels = Arrays.asList(amazon, ebay);

    System.out.println("-------- Without flatMap() ---------------------------");
    List<List<String>> mapReturn = parcels.stream()
      .map(Parcel::getItems)
      .collect(Collectors.toList());
    System.out.println("\t collect() returns: " + mapReturn);

    System.out.println("\n-------- With flatMap() ------------------------------");
    List<String> flatMapReturn = parcels.stream()
      .map(Parcel::getItems)
      .flatMap(Collection::stream)
      .collect(Collectors.toList());
    System.out.println("\t collect() returns: " + flatMapReturn);
  }
}

8
খুব খাস্তা উদাহরণ .., আপনার উদাহরণ সহ ধারণাটি বুঝতে কয়েক সেকেন্ডের বেশি লাগবে না ...
টেকডগ

2
সুন্দর ব্যাখ্যা। সহজ এবং সর্বোত্তম ব্যাখ্যার জন্য সত্যই প্রশংসা করুন
শচীন রেন

42

আপনি যে ফাংশনে পাস stream.mapকরেছেন তাতে একটি অবজেক্ট ফিরে আসতে হবে। তার অর্থ ইনপুট স্ট্রিমের প্রতিটি বস্তুর ফলাফল আউটপুট স্ট্রিমের ঠিক এক অবজেক্টে।

আপনি যে ফাংশনটি পাস করেন তা stream.flatMapপ্রতিটি বস্তুর জন্য একটি স্ট্রিম দেয়। এর অর্থ এই ফাংশনটি প্রতিটি ইনপুট অবজেক্টের জন্য কোনও সংখ্যক অবজেক্ট ফিরিয়ে দিতে পারে (কিছুই নয়)। ফলস্বরূপ স্ট্রিমগুলি তখন একটি আউটপুট স্ট্রিমের সাথে সংযুক্ত হয়।


আপনি কেন "প্রতিটি ইনপুট অবজেক্টের জন্য কোনও সংখ্যক অবজেক্ট ফিরিয়ে দিতে চান (কোনও কিছুই নয়)"?
ডেরেক মাহর

4
@ ডেরেকমাহার এর জন্য প্রচুর ব্যবহারের কেস থাকবে। উদাহরণস্বরূপ, আসুন ধরা যাক Departmentআপনার সংস্থায় আপনার একটি স্ট্রিম রয়েছে । প্রতিটি বিভাগের 0 এবং n Employeeএর মধ্যে রয়েছে। আপনার যা দরকার তা হ'ল সমস্ত কর্মচারীর একটি স্ট্রিম। তো তুমি কি কর? আপনি একটি ফ্ল্যাটম্যাপ পদ্ধতি লিখেন যা একটি বিভাগ নেয় এবং এর কর্মীদের একটি স্ট্রিম প্রদান করে।
ফিলিপ

ফিলিপ, আপনার উদাহরণটি ব্যবহারের মূল কারণটি কি চিত্রিত করে flatMap? আমি সন্দেহ করি যে এটি ঘটনাক্রমে হতে পারে এবং কী ব্যবহারের কেস বা flatMapউপস্থিত থাকার কারণ চিত্রিত করে না । (নীচে অবিরত ...)
ডেরেক মহর

Dzone.com / পার্টিকেলগুলি / বোঝাপড়া-ফ্ল্যাটম্যাপটি পড়ার পরে , আমি মনে করি পিছনে মূল প্রেরণাটি flatMapব্যবহার করার সময় উপস্থিত ত্রুটিগুলি সামঞ্জস্য করা map। মূল সেটটিতে এক বা একাধিক আইটেম কোনও আউটপুট আইটেমে ম্যাপ করা যায় না এমন ক্ষেত্রে আপনি কীভাবে পরিচালনা করবেন? প্রতিটি ইনপুট অবজেক্টের জন্য একটি মধ্যবর্তী সেট (একটি Optionalবা বলুন Stream) প্রবর্তনের flatMapমাধ্যমে আপনাকে "অবৈধ" ইনপুট অবজেক্টগুলি (বা স্ট্যাকওভারফ্লো . com / a / 52248643 / 107158 এর স্পিরিটে তথাকথিত "খারাপ আপেল" ) বাদ দিতে দেয় the চূড়ান্ত সেট।
ডেরেক মাহর

1
@ ডেরেকমাহার হ্যাঁ, প্রতিটি স্ট্রোক যেখানে প্রতিটি ইনপুট-অবজেক্ট কোনও আউটপুট-অবজেক্ট ফিরিয়ে দিতে পারে বা নাও পারে তা ফ্ল্যাট-ম্যাপের জন্য আরও ভাল ব্যবহারের ক্ষেত্রে।
ফিলিপ

29

মানচিত্রের জন্য আমাদের কাছে উপাদানগুলির একটি তালিকা এবং একটি (ফাংশন, ক্রিয়া) এফ রয়েছে:

[a,b,c] f(x) => [f(a),f(b),f(c)]

এবং সমতল মানচিত্রের জন্য আমাদের কাছে উপাদানগুলির তালিকার একটি তালিকা রয়েছে এবং আমাদের একটি (ফাংশন, ক্রিয়া) এফ রয়েছে এবং আমরা ফলাফলটি সমতল করতে চাই:

[[a,b],[c,d,e]] f(x) =>[f(a),f(b),f(c),f(d),f(e)]

25

আমার একটা অনুভূতি আছে যে এখানে বেশিরভাগ উত্তরগুলি সহজ সমস্যাটিকে ছাপিয়ে যায়। আপনি যদি ইতিমধ্যে বুঝতে পারেন mapযে কীভাবে কাজগুলি বুঝতে পারা মোটামুটি সহজ।

এমন কেস রয়েছে যেখানে ব্যবহার করার সময় আমরা অযাচিত নেস্টেড স্ট্রাকচারগুলি শেষ করতে পারি map(), flatMap()মোড়কে এড়িয়ে এটিকে কাটিয়ে ওঠার জন্য পদ্ধতিটি তৈরি করা হয়েছে।


উদাহরণ:

1

List<List<Integer>> result = Stream.of(Arrays.asList(1), Arrays.asList(2, 3))
  .collect(Collectors.toList());

আমরা ব্যবহার করে নেস্টেড তালিকাগুলি এড়াতে পারি flatMap:

List<Integer> result = Stream.of(Arrays.asList(1), Arrays.asList(2, 3))
  .flatMap(i -> i.stream())
  .collect(Collectors.toList());

2

Optional<Optional<String>> result = Optional.of(42)
      .map(id -> findById(id));

Optional<String> result = Optional.of(42)
      .flatMap(id -> findById(id));

কোথায়:

private Optional<String> findById(Integer id)

দুঃখিত তবে পয়েন্ট 1 থেকে দ্বিতীয় স্নিপেট পরিবর্তে সংকলন করছে না List<Integer> result = Stream.of(Arrays.asList(1), Arrays.asList(2, 3)) .flatMap(i -> i) .collect(Collectors.toList());। এটি হওয়া উচিতStream.of(Arrays.asList(1), Arrays.asList(2, 3)) .flatMap(List::stream) .collect(Collectors.toList());
আর্থার

@ আর্থার আমি মনে করি আমি এখানে ভ্যাভ্রির স্ট্রিম এবং তালিকা ব্যবহার করেছি - তবে আমি একমত যে এটি কিছুটা বিভ্রান্ত হতে পারে - আমি
এটিকে

@ গ্রজেগোর্জপিউওয়ারেক এই সহজ ব্যাখ্যা সম্পর্কে কীভাবে ?
ইউজিন

22

Racচ্ছিক সম্পর্কিত ওরাকলের নিবন্ধটি মানচিত্র এবং ফ্ল্যাটম্যাপের মধ্যে এই পার্থক্যটিকে হাইলাইট করে:

String version = computer.map(Computer::getSoundcard)
                  .map(Soundcard::getUSB)
                  .map(USB::getVersion)
                  .orElse("UNKNOWN");

দুর্ভাগ্যক্রমে, এই কোডটি সংকলন করে না। কেন? ভেরিয়েবল কম্পিউটার টাইপযুক্ত Optional<Computer>, তাই মানচিত্রের পদ্ধতিটি কল করা একেবারে সঠিক। তবে, গেটসাউন্ডকার্ড () typeচ্ছিক টাইপের একটি অবজেক্ট দেয়। এর অর্থ মানচিত্রের ক্রিয়াকলাপের ফলাফলটি একটি ধরণের বস্তুOptional<Optional<Soundcard>> । ফলস্বরূপ, getUSB () এ কলটি অবৈধ কারণ বাহ্যিকতম ptionচ্ছিকটিতে এর মান হিসাবে অন্য একটি ptionচ্ছিক রয়েছে যা অবশ্যই ইউএসবিবি () পদ্ধতিটিকে সমর্থন করে না।

স্ট্রিম সহ, ফ্ল্যাটম্যাপ পদ্ধতিটি আর্গুমেন্ট হিসাবে একটি ফাংশন নেয়, যা অন্য স্ট্রিমটি দেয় returns এই ফাংশনটি একটি স্ট্রিমের প্রতিটি উপাদানগুলিতে প্রয়োগ করা হয়, যার ফলস্বরূপ একটি স্ট্রিমের স্রোত ঘটে। তবে ফ্ল্যাটম্যাপে প্রতিটি উত্পন্ন স্ট্রিমটি সেই স্ট্রিমের বিষয়বস্তু দ্বারা প্রতিস্থাপনের প্রভাব রয়েছে। অন্য কথায়, ফাংশন দ্বারা উত্পন্ন সমস্ত পৃথক স্ট্রিমগুলি একক স্ট্রিমের সাথে একত্রিত বা "সমতল" হয়ে যায়। আমরা এখানে যা চাই তা অনুরূপ, তবে আমরা একটি দ্বি-স্তরের oneচ্ছিককে "সমতল" করতে চাই

Ptionচ্ছিক একটি ফ্ল্যাটম্যাপ পদ্ধতি সমর্থন করে। এর উদ্দেশ্যটি হ'ল একটি ptionচ্ছিকের মান (যেমন মানচিত্রের অপারেশনটি করে) এর মান রূপান্তরকরণ ফাংশন প্রয়োগ করা এবং তারপরে ফলস্বরূপ দ্বি-স্তরের ptionচ্ছিককে একক মধ্যে সমতল করা

সুতরাং, আমাদের কোডটি সঠিক করতে, আমাদের ফ্ল্যাটম্যাপ ব্যবহার করে নীচে এটি আবার লিখতে হবে:

String version = computer.flatMap(Computer::getSoundcard)
                   .flatMap(Soundcard::getUSB)
                   .map(USB::getVersion)
                   .orElse("UNKNOWN");

প্রথম ফ্ল্যাটম্যাপটি নিশ্চিত করে যে একটি Optional<Soundcard>পরিবর্তে একটি ফেরত এসেছে Optional<Optional<Soundcard>>, এবং দ্বিতীয় ফ্ল্যাটম্যাপটি একটি ফেরত দেওয়ার জন্য একই উদ্দেশ্য অর্জন করেছে Optional<USB>। দ্রষ্টব্য যে তৃতীয় কলটি কেবলমাত্র একটি মানচিত্র () হওয়া দরকার কারণ গেট ভার্সন () একটি alচ্ছিক বস্তুর পরিবর্তে একটি স্ট্রিং প্রদান করে।

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html


1
প্রশ্নটি ছিল স্ট্রিম.ম্যাপ এবং স্ট্রিম.ফ্ল্যাটম্যাপ সম্পর্কে এবং অপশনাল.ম্যাপ সম্পর্কে নয়
অপশনাল.ফ্ল্যাটম্যাপ

4
তবে এটি problemsচ্ছিক এবং ফ্ল্যাটম্যাপ দিয়ে আমার সমস্যাগুলি বুঝতে আমাকে অনেক সাহায্য করেছে, অনেক ধন্যবাদ!
Loïc

2
@ ডিজেমস, এটি পুরোপুরি বৈধ উত্তর, অনুচ্ছেদ থেকে শুরু করে এটি পড়ুন "স্রোতের সাথে, ফ্ল্যাটম্যাপ পদ্ধতিটি একটি যুক্তি হিসাবে ফাংশন নেয় ..." :)
স্কুইস্কাগার

আমি মনে করি যে এখানে অন্যান্য উত্তরগুলির মধ্যে এটি একটি খুব দরকারী সংযোজন।
এমজেড এ

ফ্ল্যাটম্যাপ () সংস্করণটি নালপয়েন্টটারেক্সেপশনও ছুঁড়ে দেয় যদি সাউন্ডকার্ড নাল হয়। তাহলে ptionচ্ছিকের প্রতিশ্রুত সুবিধা কোথায়?
একটারিনা

16

আমি এটির উত্তর দেওয়ার কথা বলে আমি নিশ্চিত নই, তবে প্রতিবারই আমি যখন এমন কাউকে মুখোমুখি হয়েছি যা বুঝতে পারে না, আমি একই উদাহরণ ব্যবহার করি।

আপনি একটি আপেল আছে কল্পনা করুন। এ উদাহরণস্বরূপ বা এক-থেকে-এক ম্যাপিংয়ে mapসেই আপেলটিকে রূপান্তরিত করছে ।apple-juice

একই আপেল নিন এবং এটি থেকে কেবল বীজ বের করুন, এটি যা flatMapকরে বা অনেকের কাছে একটি , একটি আপেল ইনপুট হিসাবে, বহু বীজ আউটপুট হিসাবে আসে।


4
এটি একটি আকর্ষণীয় উদাহরণ :)
cassiomolin

জন্য flatMapমামলা, আপনাকে অবশ্যই প্রথমে প্রতি আপেল থেকে বীজ আলাদা ব্যাগে প্রতি আপেল এক ব্যাগ, সংগ্রহ করবেন করার আগে আপনাকে একটি একক ব্যাগ মধ্যে ব্যাগ সব ঢালা?
ডেরেক মাহর

@ ডেরেকমাহার জাভা -১০ এর আগে এটি একক ব্যাগে দরিদ্র হিসাবে ব্যবহৃত হত, যার অর্থ flatmapআসলে অলস ছিল না, তবে জাভা -১০ যেহেতু এটি অলস
ইউজিন

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

@ জাভা শুধু অনুসন্ধান করুন flatMap + lazy, আমি বাজি ধরছি কিছু উত্তর হবে।
ইউজিন

16

মানচিত্র () এবং ফ্ল্যাটম্যাপ ()

  1. map()

কেবলমাত্র একটি ফাংশন নেয় একটি ল্যাম্বডা পরম যেখানে টি উপাদান থাকে আর আর টি ব্যবহার করে রিটার্ন উপাদান তৈরি হয় the

Stream
  .of(1,2,3,4,5)
  .map(myInt -> "preFix_"+myInt)
  .forEach(System.out::println);

এটি কেবল টাইপের 1 থেকে 5 টি উপাদান নেয় Integer, প্রতিটি উপাদানকে Stringমান সহ টাইপ থেকে নতুন উপাদান তৈরি করতে "prefix_"+integer_valueএবং মুদ্রণ করে তা ব্যবহার করে।

  1. flatMap()

এটি জেনে রাখা কার্যকর যে ফ্ল্যাটম্যাপ () কোনও ফাংশন নেয় F<T, R>যেখানে

  • টি এমন একটি ধরন যা থেকে / দিয়ে স্ট্রিম তৈরি করা যায় । এটি একটি তালিকা (টি.স্ট্রিম ()), একটি অ্যারে (অ্যারেস স্ট্রিম (কিছু অ্যারে)) ইত্যাদি হতে পারে anything প্রতিটি দেবের নীচের উদাহরণে অনেকগুলি ভাষা রয়েছে, তাই দেব। ভাষাগুলি একটি তালিকা এবং ল্যাম্বডা প্যারামিটার ব্যবহার করবে।

  • আর টি ফলাফল ব্যবহার করে নির্মিত হবে যা টি ব্যবহার করে তৈরি করা হবে we আমাদের টি এর অনেকগুলি দৃষ্টান্ত রয়েছে তা জেনেও আমাদের কাছে প্রাকৃতিকভাবে আর থেকে প্রচুর স্ট্রিম হবে Type টাইপ আর এর এই সমস্ত স্ট্রিমগুলি এখন টাইপ আর থেকে একটি একক 'ফ্ল্যাট' স্ট্রিমের সাথে মিলিত হবে Type ।

উদাহরণ

বাচ্চিরি তৌফিকের উদাহরণগুলি এখানে এর উত্তর দেখতে সহজ এবং বোঝা সহজ। কেবল স্পষ্টতার জন্য, কেবল আমাদের বলুন যে আমাদের বিকাশকারীদের একটি দল রয়েছে:

dev_team = {dev_1,dev_2,dev_3}

, প্রতিটি বিকাশকারী অনেক ভাষা জানার সাথে:

dev_1 = {lang_a,lang_b,lang_c},
dev_2 = {lang_d},
dev_2 = {lang_e,lang_f}

প্রতিটি দেবের ভাষা পেতে Dev_team এ স্ট্রিম.ম্যাপ () প্রয়োগ করা :

dev_team.map(dev -> dev.getLanguages())

আপনাকে এই কাঠামো দেবে:

{ 
  {lang_a,lang_b,lang_c},
  {lang_d},
  {lang_e,lang_f}
}

যা মূলত ক List<List<Languages>> /Object[Languages[]]। খুব সুন্দর না, জাভা 8 -র মতো !!

সঙ্গে Stream.flatMap()আপনি খুঁজে 'চেপ্টা' করতে জিনিষ যেমন উপরে গঠন লাগে
এবং সেটিকে পালাক্রমে {lang_a, lang_b, lang_c, lang_d, lang_e, lang_f}, যা মূলত হিসাবে ব্যবহার করতে পারেন List<Languages>/Language[]/etc...

সুতরাং শেষ অবধি, আপনার কোডটি এরকম আরও অর্থবোধ করবে:

dev_team
   .stream()    /* {dev_1,dev_2,dev_3} */
   .map(dev -> dev.getLanguages()) /* {{lang_a,...,lang_c},{lang_d}{lang_e,lang_f}}} */
   .flatMap(languages ->  languages.stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
   .doWhateverWithYourNewStreamHere();

বা সহজভাবে:

dev_team
       .stream()    /* {dev_1,dev_2,dev_3} */
       .flatMap(dev -> dev.getLanguages().stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
       .doWhateverWithYourNewStreamHere();

কখন মানচিত্র () ব্যবহার করবেন এবং ফ্ল্যাটম্যাপ () ব্যবহার করবেন :

  • ব্যবহারের map()যখন আপনার স্ট্রীম থেকে টাইপ টি প্রতিটি উপাদান ম্যাপ করা অনুমিত হয় / একটি রুপান্তরিত একক টাইপ আর উপাদান ফলাফলের ধরনের একটি ম্যাপিং হয় (1 শুরুর উপাদানের -> 1 শেষ উপাদান) এবং ধরন আর উপাদানের নতুন প্রবাহ ফেরত দেওয়া হয়

  • ব্যবহারের flatMap()আপনার স্ট্রীম থেকে টাইপ টি প্রতিটি উপাদান ম্যাপ / একটি রুপান্তরিত অনুমিত হয় যখন সংগ্রহগুলি একটি টাইপ এর ম্যাপিং ধরণ আর ফলাফলের উপাদানের হয় (1 শুরুর উপাদানের -> এন শেষ উপাদান) । এই সংগ্রহগুলি তখন আর টাইপের আর এর উপাদানগুলির একটি নতুন প্রবাহে মার্জড (বা সমতল ) করা হবে n উদাহরণস্বরূপ নেস্টেড লুপগুলি উপস্থাপন করার জন্য এটি দরকারী ।

প্রাক জাভা 8:

List<Foo> myFoos = new ArrayList<Foo>();
    for(Foo foo: myFoos){
        for(Bar bar:  foo.getMyBars()){
            System.out.println(bar.getMyName());
        }
    }

পোস্ট জাভা 8

myFoos
    .stream()
    .flatMap(foo -> foo.getMyBars().stream())
    .forEach(bar -> System.out.println(bar.getMyName()));

11

মানচিত্র: - এই পদ্ধতিটি একটি যুক্তি হিসাবে একটি ফাংশন নেয় এবং স্ট্রিমের সমস্ত উপাদানগুলিতে পাস ফাংশন প্রয়োগ করে ফলাফলের সমন্বয়ে একটি নতুন স্ট্রিম দেয়।

আসুন কল্পনা করুন, আমার কাছে পূর্ণসংখ্যার মানগুলির তালিকা রয়েছে (1,2,3,4,5) এবং একটি ফাংশন ইন্টারফেস যার যুক্তিটি উত্তীর্ণ পূর্ণসংখ্যার বর্গক্ষেত্র। (ই -> ই * ই)।

List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> newList = intList.stream().map( e -> e * e ).collect(Collectors.toList());

System.out.println(newList);

আউটপুট: -

[1, 4, 9, 16, 25]

আপনি দেখতে পাচ্ছেন, একটি আউটপুট একটি নতুন স্ট্রিম যার মানগুলি ইনপুট প্রবাহের মানগুলির বর্গ।

[1, 2, 3, 4, 5] -> apply e -> e * e -> [ 1*1, 2*2, 3*3, 4*4, 5*5 ] -> [1, 4, 9, 16, 25 ]

http://codedestine.com/java-8-stream-map-method/

ফ্ল্যাটম্যাপ: - এই পদ্ধতিটি একটি আর্গুমেন্ট হিসাবে একটি ফাংশন নেয়, এই ফাংশনটি একটি ইনপুট আর্গুমেন্ট হিসাবে একটি পরামিতি টি গ্রহণ করে এবং প্যারামিটার আর এর একটি স্ট্রিমকে রিটার্ন মান হিসাবে প্রদান করে। এই ফাংশনটি এই স্ট্রিমের প্রতিটি উপাদানগুলিতে প্রয়োগ করা হলে এটি নতুন মানগুলির একটি স্ট্রিম তৈরি করে। প্রতিটি উপাদান দ্বারা উত্পাদিত এই নতুন স্ট্রিমের সমস্ত উপাদানগুলি একটি নতুন স্ট্রিমে অনুলিপি করা হয়, যা এই পদ্ধতির ফেরত মান হবে।

আসুন চিত্রটি আসুন, আমার কাছে শিক্ষার্থীদের অবজেক্টের একটি তালিকা রয়েছে, যেখানে প্রতিটি শিক্ষার্থী একাধিক বিষয়ের জন্য বেছে নিতে পারে।

List<Student> studentList = new ArrayList<Student>();

  studentList.add(new Student("Robert","5st grade", Arrays.asList(new String[]{"history","math","geography"})));
  studentList.add(new Student("Martin","8st grade", Arrays.asList(new String[]{"economics","biology"})));
  studentList.add(new Student("Robert","9st grade", Arrays.asList(new String[]{"science","math"})));

  Set<Student> courses = studentList.stream().flatMap( e -> e.getCourse().stream()).collect(Collectors.toSet());

  System.out.println(courses);

আউটপুট: -

[economics, biology, geography, science, history, math]

আপনি দেখতে পাচ্ছেন, একটি আউটপুট একটি নতুন স্ট্রিম যার মানগুলি ইনপুট স্ট্রিমের প্রতিটি উপাদান দ্বারা প্রত্যাবর্তিত স্ট্রিমের সমস্ত উপাদানগুলির সংগ্রহ।

[এস 1, এস 2, এস 3] -> [history "ইতিহাস", "গণিত", "ভূগোল"}, econom "অর্থনীতি", "জীববিজ্ঞান"}, science "বিজ্ঞান", "গণিত"}] -> অনন্য বিষয় নিন - > [অর্থনীতি, জীববিজ্ঞান, ভূগোল, বিজ্ঞান, ইতিহাস, গণিত]

http://codedestine.com/java-8-stream-flatmap-method/


আপনি যদি কেবল ডক লিঙ্ক সরবরাহের পরিবর্তে কোড সরবরাহ করেন তবে একটি পার্থক্য করতে পারে
চার্লস-এন্টোইন

11

.map জন্য > b - একটি ম্যাপিং

Stream.of("dog", "cat")              // stream of 2 Strings
    .map(s -> s.length())            // stream of 2 Integers: [3, 3]

এটি যে কোনও আইটেমকে Aযে কোনও আইটেমে রূপান্তর করে BJavadoc


.flatMap জন্য একটি -> স্ট্রিম <বি> concatinating

Stream.of("dog", "cat")             // stream of 2 Strings
    .flatMapToInt(s -> s.chars())   // stream of 6 ints:      [d, o, g, c, a, t]

এটি --1 কোনও আইটেমকে রূপান্তর Aকরে Stream< B>, তারপরে --2 সমস্ত স্ট্রিমকে এক (সমতল) প্রবাহে যুক্ত করে। Javadoc


নোট 1: যদিও পরবর্তী উদাহরণগুলি বস্তুর স্ট্রিমের (স্ট্রিম) পরিবর্তে আদিম প্রবাহের (স্ট্রিম) ফ্ল্যাটটিতে ফ্ল্যাট করে, তবুও এটি এর ধারণাটি চিত্রিত করে .flatMap

দ্রষ্টব্য 2: নাম সত্ত্বেও, স্ট্রিং.কমার () পদ্ধতিটি ইনটগুলি ফেরত দেয়। সুতরাং আসল সংগ্রহটি হ'ল:, কোডটি [100, 111, 103, 99, 97, 116] কোথায় , ইত্যাদি কোড কোড আবার, উদাহরণস্বরূপ উদ্দেশ্যে, এটি [d, o, g, c, a, t] হিসাবে উপস্থাপিত হয়।100'd'111'o'


3
সেরা উত্তর. উদাহরণগুলির সাথে সরাসরি বক্তব্য
গ্যাব্রিয়েলবিবি

1

সহজ উত্তর।

mapঅপারেশন তৈরী করতে পারে Streamএর Stream.EXStream<Stream<Integer>>

flatMapঅপারেশন শুধুমাত্র Streamকিছু উত্পাদন করবে । গো EXStream<Integer>


0

আপনি যদি পরিচিত হন তবে ভাল উপমা সি # এর সাথেও থাকতে পারে। মূলত সি # Selectজাভা mapএবং সি # SelectManyজাভা এর সমান flatMap। সংগ্রহের জন্য একই কোটলিনে প্রযোজ্য।


0

এটি নতুনদের জন্য খুব বিভ্রান্তিকর। মূল পার্থক্যটি mapতালিকার প্রতিটি প্রবেশের জন্য একটি আইটেম নির্গত হয় এবং flatMapএটি মূলত একটি map+ flattenক্রিয়াকলাপ। আরও পরিষ্কার হওয়ার জন্য, যখন আপনার একাধিক মানের প্রয়োজন হয় তখন ফ্ল্যাটম্যাপ ব্যবহার করুন, উদাহরণস্বরূপ যখন আপনি অ্যারেগুলি ফিরানোর জন্য কোনও লুপের প্রত্যাশা করছেন, ফ্ল্যাটম্যাপ এই ক্ষেত্রে সত্যিই সহায়ক হবে।

আমি এটি সম্পর্কে একটি ব্লগ লিখেছি, আপনি এটি এখানে পরীক্ষা করে দেখতে পারেন ।



0

স্ট্রিম অপারেশন flatMapএবং mapইনপুট হিসাবে একটি ফাংশন গ্রহণ।

flatMapফাংশনটি স্ট্রিমের প্রতিটি উপাদানের জন্য একটি নতুন স্ট্রিম প্রত্যাবর্তনের প্রত্যাশা করে এবং একটি স্ট্রিম প্রদান করে যা প্রতিটি উপাদানটির জন্য ফাংশন দ্বারা ফিরে আসা স্ট্রিমের সমস্ত উপাদানকে একত্রিত করে। অন্য কথায়, flatMapউত্স থেকে প্রতিটি উপাদানগুলির জন্য, একাধিক উপাদান ফাংশন দ্বারা তৈরি করা হবে। http://www.zoftino.com/java-stream-examples#flatmap-operation

mapফাংশনটি রূপান্তরিত মান ফেরত প্রত্যাশা করে এবং রূপান্তরকারী উপাদানগুলি সহ একটি নতুন স্ট্রিম ফেরায়। অন্য কথায়, mapউত্স থেকে প্রতিটি উপাদানগুলির জন্য, ফাংশন দ্বারা একটি রূপান্তরিত উপাদান তৈরি করা হবে। http://www.zoftino.com/java-stream-examples#map-operation


0

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


0

যদি আপনি map()পুনরাবৃত্তি হিসাবে (এক স্তর forলুপ) হিসাবে মনে করেন , তবে flatmap()এটি দ্বি-স্তরের পুনরাবৃত্তি (নেস্টেড forলুপের মতো)। (প্রতিটি পুনরাবৃত্ত উপাদান প্রবেশ করান foo, এবং এটিতে আবার foo.getBarList()পুনরাবৃত্তি করুন barList)


map(): একটি স্ট্রিম নিন, প্রতিটি উপাদানকে কিছু করুন, প্রতিটি প্রক্রিয়াটির একক ফলাফল সংগ্রহ করুন, অন্য স্ট্রিম আউটপুট করুন। "কিছু কাজ করুন" এর সংজ্ঞা অন্তর্নিহিত। কোন উপাদান processment ফলাফল যদি null, nullচূড়ান্ত প্রবাহ রচনা করতে ব্যবহার করা হয়। সুতরাং, ফলাফল প্রবাহে উপাদানগুলির সংখ্যা ইনপুট স্ট্রিমের সংখ্যার সমান হবে।

flatmap(): উপাদানগুলি / স্ট্রিমগুলির একটি স্ট্রিম এবং একটি ফাংশন (স্পষ্ট সংজ্ঞা) নিন, প্রতিটি স্ট্রিমের প্রতিটি উপাদানগুলিতে ফাংশনটি প্রয়োগ করুন এবং মধ্যবর্তী ফলস্বরূপ সমস্ত স্ট্রিম বৃহত্তর প্রবাহ ("সমতলকরণ") হিসাবে সংগ্রহ করুন। যদি কোনও উপাদানটির প্রক্রিয়াজাতকরণের ফলস্বরূপ null, খালি প্রবাহ "সমতলকরণ" এর চূড়ান্ত ধাপে সরবরাহ করা হয়। ফলাফলটি স্ট্রিমের উপাদানগুলির সংখ্যা, ইনপুটটি বেশ কয়েকটি স্ট্রিম থাকলে সমস্ত ইনপুটগুলিতে অংশ নেওয়া সমস্ত উপাদানগুলির মোট।

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