ল্যাম্বদা (java.util.stream.Streams.zip) দিয়ে জেডিকে 8 ব্যবহার করে স্ট্রিপগুলি জিপ করা হচ্ছে


149

লাম্বদা বি -৯৩ সহ জেডিকে ৮-এ বি93-তে একটি শ্রেণির java.util.stream.Streams.zip ছিল যা জিপ স্ট্রিমে ব্যবহার করা যেতে পারে (এটি জাভা 8 লাম্বডাস এক্সপ্লোরার টিউটোরিয়ালে চিত্রিত হয়েছে । ধনঞ্জয় নেনে রচনাংশ 1 )। এই ফাংশন:

একটি অলস এবং অনুক্রমিক সম্মিলিত স্ট্রিম তৈরি করে যার উপাদানগুলি দুটি স্ট্রিমের উপাদানগুলির সংমিশ্রণের ফলাফল।

তবে b98 এ এটি অদৃশ্য হয়ে গেছে। Infact Streamsক্লাসে এমনকি অ্যাক্সেসযোগ্য নয় B98 মধ্যে java.util.stream

এই কার্যকারিতাটি কি সরানো হয়েছে, এবং যদি তা হয় তবে আমি কীভাবে b98 ব্যবহার করে সংক্ষেপে জিপ স্ট্রিম করব?

আমার মনে থাকা অ্যাপ্লিকেশনটি শেনের এই জাভা বাস্তবায়নের মধ্যে রয়েছে , যেখানে আমি জিপ কার্যকারিতাটি প্রতিস্থাপন করেছি

  • static <T> boolean every(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)
  • static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred)

বরং ভার্বোজ কোড সহ ফাংশন (যা বি 98 থেকে কার্যকারিতা ব্যবহার করে না)।


3
আহ কেবলমাত্র এটি খুঁজে পেয়েছে যে এটি সম্পূর্ণরূপে সরানো হয়েছে বলে মনে হয়েছে: mail.openjdk.java.net/pipermail/lambda-libs-spec-observers/…
আর্টেলা

"জাভা 8 লাম্বডাস এক্সপ্লোর করা। পর্ব 1" - এই নিবন্ধটির জন্য নতুন লিঙ্কটি হল blog.dhananjaynene.com/2013/02/exploring-java8-lambdas-part-1
আলেক্সেই এগারোভ

উত্তর:


77

আমার এটিরও প্রয়োজন ছিল তাই আমি কেবল b93 থেকে উত্স কোডটি নিয়েছি এবং এটি "ব্যবহারকারীর" শ্রেণিতে রেখেছি। বর্তমান এপিআইয়ের সাথে কাজ করার জন্য আমাকে এটি সামান্য পরিবর্তন করতে হয়েছিল।

রেফারেন্সের জন্য এখানে ওয়ার্কিং কোড (এটি নিজের ঝুঁকিতে নিয়ে যান ...):

public static<A, B, C> Stream<C> zip(Stream<? extends A> a,
                                     Stream<? extends B> b,
                                     BiFunction<? super A, ? super B, ? extends C> zipper) {
    Objects.requireNonNull(zipper);
    Spliterator<? extends A> aSpliterator = Objects.requireNonNull(a).spliterator();
    Spliterator<? extends B> bSpliterator = Objects.requireNonNull(b).spliterator();

    // Zipping looses DISTINCT and SORTED characteristics
    int characteristics = aSpliterator.characteristics() & bSpliterator.characteristics() &
            ~(Spliterator.DISTINCT | Spliterator.SORTED);

    long zipSize = ((characteristics & Spliterator.SIZED) != 0)
            ? Math.min(aSpliterator.getExactSizeIfKnown(), bSpliterator.getExactSizeIfKnown())
            : -1;

    Iterator<A> aIterator = Spliterators.iterator(aSpliterator);
    Iterator<B> bIterator = Spliterators.iterator(bSpliterator);
    Iterator<C> cIterator = new Iterator<C>() {
        @Override
        public boolean hasNext() {
            return aIterator.hasNext() && bIterator.hasNext();
        }

        @Override
        public C next() {
            return zipper.apply(aIterator.next(), bIterator.next());
        }
    };

    Spliterator<C> split = Spliterators.spliterator(cIterator, zipSize, characteristics);
    return (a.isParallel() || b.isParallel())
           ? StreamSupport.stream(split, true)
           : StreamSupport.stream(split, false);
}

1
ফলে স্ট্রিম হবে না উচিত SIZEDযদি পারেন স্ট্রিমটি SIZEDনা উভয়?
দিদিয়ের এল

5
আমি তাই মনে করি না. উভয় স্ট্রিমই SIZEDএই বাস্তবায়নের জন্য কাজ করতে হবে । এটি আসলে আপনি জিপিং কীভাবে সংজ্ঞায়িত করেন তার উপর নির্ভর করে। উদাহরণস্বরূপ, আপনি দুটি স্ট্রিম বিভিন্ন আকারের জিপ করতে সক্ষম হবেন? ফলাফলের স্ট্রিমটি তখন কেমন হবে? আমি বিশ্বাস করি এই কারণেই এই ফাংশনটি API থেকে বাদ দেওয়া হয়েছিল। এটি করার অনেকগুলি উপায় রয়েছে এবং ব্যবহারকারীর সিদ্ধান্ত নেওয়া উচিত যে কোন আচরণটি "সঠিক" হওয়া উচিত। আপনি কি দীর্ঘ প্রবাহ থেকে উপাদানগুলি বাতিল করবেন বা সংক্ষিপ্ত তালিকাটি প্যাড করবেন? যদি তাই হয় তবে কোন মান (গুলি) দিয়ে?
সিকি

আমি যদি কিছু মিস করি না তবে কোনও কাস্টের প্রয়োজন নেই (যেমন Spliterator<A>)।
jub0bs

জাভা 8 বি 93 উত্স কোডটি হোস্ট করা আছে এমন কোনও ওয়েবসাইট আছে? এটি খুঁজে পেতে আমার সমস্যা হচ্ছে।
স্টারওয়ার্সুই

42

প্রোটনপ্যাক লাইব্রেরি দ্বারা সরবরাহিত ফাংশনগুলির মধ্যে জিপ অন্যতম ।

Stream<String> streamA = Stream.of("A", "B", "C");
Stream<String> streamB  = Stream.of("Apple", "Banana", "Carrot", "Doughnut");

List<String> zipped = StreamUtils.zip(streamA,
                                      streamB,
                                      (a, b) -> a + " is for " + b)
                                 .collect(Collectors.toList());

assertThat(zipped,
           contains("A is for Apple", "B is for Banana", "C is for Carrot"));

1
স্ট্রিমেক্সেও পাওয়া গেছে: amaembo.github.io/streamex/javadoc/one/util/streamex/…
টোকল্যান্ড

34

আপনার প্রকল্পে যদি পেয়ারা থাকে তবে আপনি স্ট্রিমস.জাইপ পদ্ধতিটি ব্যবহার করতে পারেন (পেয়ারা 21-তে যোগ করা হয়েছিল):

স্ট্রিমএ এবং স্ট্রিমবি এর প্রতিটিটির সাথে সম্পর্কিত উপাদানটি কার্যকর করার জন্য প্রতিটি উপাদান একটি স্ট্রিম ফেরত দেয়। ফলস্বরূপ স্ট্রিমটি কেবলমাত্র দুটি ইনপুট স্ট্রিমের সংক্ষিপ্ততর হবে; যদি একটি স্ট্রিম দীর্ঘ হয় তবে এর অতিরিক্ত উপাদানগুলি উপেক্ষা করা হবে। ফলস্বরূপ স্ট্রিম দক্ষতার সাথে বিভাজনযোগ্য নয়। এটি সমান্তরাল কর্মক্ষমতা ক্ষতি করতে পারে।

 public class Streams {
     ...

     public static <A, B, R> Stream<R> zip(Stream<A> streamA,
             Stream<B> streamB, BiFunction<? super A, ? super B, R> function) {
         ...
     }
 }

26

জিপ করা হচ্ছে দুই ল্যামডা (সঙ্গে JDK8 ব্যবহার স্ট্রিম সারকথা )।

public static <A, B, C> Stream<C> zip(Stream<A> streamA, Stream<B> streamB, BiFunction<A, B, C> zipper) {
    final Iterator<A> iteratorA = streamA.iterator();
    final Iterator<B> iteratorB = streamB.iterator();
    final Iterator<C> iteratorC = new Iterator<C>() {
        @Override
        public boolean hasNext() {
            return iteratorA.hasNext() && iteratorB.hasNext();
        }

        @Override
        public C next() {
            return zipper.apply(iteratorA.next(), iteratorB.next());
        }
    };
    final boolean parallel = streamA.isParallel() || streamB.isParallel();
    return iteratorToFiniteStream(iteratorC, parallel);
}

public static <T> Stream<T> iteratorToFiniteStream(Iterator<T> iterator, boolean parallel) {
    final Iterable<T> iterable = () -> iterator;
    return StreamSupport.stream(iterable.spliterator(), parallel);
}

2
চমৎকার সমাধান এবং (তুলনামূলকভাবে) কমপ্যাক্ট! আপনার ফাইলের শীর্ষে import java.util.function.*;এবং লাগানো দরকার import java.util.stream.*;
এসএফসিসি

নোট করুন যে এটি স্ট্রিমের একটি টার্মিনাল অপারেশন। এর অর্থ অনন্ত স্ট্রিমগুলির জন্য, এই পদ্ধতিটি ভেঙে যায়
স্মাক 89

2
তাই অনেক বেহুদা চাদরে: এখানে () -> iteratorএবং এখানে আবার iterable.spliterator()। কেন না Spliteratorবরং সরাসরি বাস্তবায়ন Iterator? @Doradus উত্তর চেক stackoverflow.com/a/46230233/1140754
মিগুয়েল Gamboa

20

যেহেতু আমি ইনডেক্সড (তালিকাগুলি) ব্যতীত অন্য সংগ্রহগুলিতে জিপিংয়ের কোনও ব্যবহার কল্পনা করতে পারি না এবং আমি সরলতার একটি বড় অনুরাগী, এটি আমার সমাধান হবে:

<A,B,C>  Stream<C> zipped(List<A> lista, List<B> listb, BiFunction<A,B,C> zipper){
     int shortestLength = Math.min(lista.size(),listb.size());
     return IntStream.range(0,shortestLength).mapToObj( i -> {
          return zipper.apply(lista.get(i), listb.get(i));
     });        
}

1
আমার মনে হয় mapToObjectহওয়া উচিত mapToObj
seanf

যদি তালিকাটি না হয় RandomAccess(উদাহরণস্বরূপ লিঙ্কযুক্ত তালিকাগুলিতে) এটি খুব ধীর হবে
অ্যাভোমোহন

স্পষ্টভাবে. তবে বেশিরভাগ জাভা বিকাশকারীই ভাল জানেন যে লিংকডলিস্টের সূচক অ্যাক্সেস অপারেশনগুলির জন্য খারাপ সম্পাদনা রয়েছে।
রাফেল

11

আপনি উল্লিখিত শ্রেণীর Streamপদ্ধতিগুলি ডিফল্ট পদ্ধতির পক্ষে নিজেই ইন্টারফেসে সরানো হয়েছে । তবে মনে হয় zipপদ্ধতিটি সরিয়ে দেওয়া হয়েছে। হতে পারে কারণ এটি বিভিন্ন আকারের স্ট্রিমগুলির জন্য ডিফল্ট আচরণটি কী তা পরিষ্কার নয়। তবে কাঙ্ক্ষিত আচরণ বাস্তবায়ন সোজা-এগিয়ে রয়েছে:

static <T> boolean every(
  Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred) {
    Iterator<T> it=c2.iterator();
    return c1.stream().allMatch(x->!it.hasNext()||pred.test(x, it.next()));
}
static <T> T find(Collection<T> c1, Collection<T> c2, BiPredicate<T, T> pred) {
    Iterator<T> it=c2.iterator();
    return c1.stream().filter(x->it.hasNext()&&pred.test(x, it.next()))
      .findFirst().orElse(null);
}

নয় predicateআপনি ফিল্টার প্রেরণ stateful ? এটি পদ্ধতির চুক্তি লঙ্ঘন করে এবং সমান্তরালে স্ট্রিমটি প্রক্রিয়া করার সময় বিশেষত কাজ করবে না।
Andreas

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

2
@ আন্ড্রেয়াস: আপনি অনুমান করতে পারেন কেন এই অপারেশনগুলি জাভা এপিআই থেকে সরানো হয়েছে…
হোলার

8

আমি এই বাস্তবায়ন বিনীতভাবে প্রস্তাব। ফলস্বরূপ স্ট্রিমটি দুটি ইনপুট স্ট্রিমের সংক্ষিপ্ত অংশে কেটে যায়।

public static <L, R, T> Stream<T> zip(Stream<L> leftStream, Stream<R> rightStream, BiFunction<L, R, T> combiner) {
    Spliterator<L> lefts = leftStream.spliterator();
    Spliterator<R> rights = rightStream.spliterator();
    return StreamSupport.stream(new AbstractSpliterator<T>(Long.min(lefts.estimateSize(), rights.estimateSize()), lefts.characteristics() & rights.characteristics()) {
        @Override
        public boolean tryAdvance(Consumer<? super T> action) {
            return lefts.tryAdvance(left->rights.tryAdvance(right->action.accept(combiner.apply(left, right))));
        }
    }, leftStream.isParallel() || rightStream.isParallel());
}

আমি আপনার প্রস্তাব পছন্দ। তবে আমি শেষের সাথে পুরোপুরি একমত হই না .., leftStream.isParallel() || rightStream.isParallel()। আমি মনে করি এটির কোনও প্রভাব নেই কারণ AbstractSpliteratorডিফল্টরূপে সীমিত সমান্তরালতা উপলব্ধ। সুতরাং আমি মনে করি যে চূড়ান্ত ফলাফলটি পাসের মতো হবে false
মিগুয়েল গ্যাম্বোয়া

@ মিগুয়েলগাম্বো - আপনার মন্তব্যের জন্য ধন্যবাদ আমি নিশ্চিত না যে আপনি "ডিফল্টরূপে সীমিত সমান্তরালতা" বলতে কী বোঝায় - আপনার কি কিছু ডক্সের লিঙ্ক আছে?
দুরাদাস

6

অলস-সেক লাইব্রেরি জিপ কার্যকারিতা সরবরাহ করে।

https://github.com/nurkiewicz/LazySeq

এই লাইব্রেরিটি ভারীভাবে অনুপ্রাণিত হয়েছে scala.collection.immutable.Streamএবং উদ্দেশ্যহীন, থ্রেড-নিরাপদ এবং অলস ক্রম প্রয়োগটি সম্ভবত অসীম সরবরাহ করা।


5

সর্বশেষতম পেয়ারা গ্রন্থাগার ( Streamsক্লাসের জন্য) ব্যবহার করে আপনার করা উচিত be

final Map<String, String> result = 
    Streams.zip(
        collection1.stream(), 
        collection2.stream(), 
        AbstractMap.SimpleEntry::new)
    .collect(Collectors.toMap(e -> e.getKey(), e  -> e.getValue()));

2

এটি কি আপনার জন্য কাজ করবে? এটি একটি সংক্ষিপ্ত ফাংশন, যা এটি জিপ করা প্রবাহগুলির উপরে অলসভাবে মূল্যায়ন করে, তাই আপনি এটিকে অনন্ত স্ট্রিম সরবরাহ করতে পারেন (এটি জিপ হওয়ার প্রবাহের আকার নিতে হবে না)।

যদি স্ট্রিমগুলি সসীম হয় তবে এর মধ্যে যে কোনও একটি স্ট্রিমের উপাদান শেষ হয়ে যাওয়ার সাথে সাথে এটি বন্ধ হয়ে যায়।

import java.util.Objects;
import java.util.function.BiFunction;
import java.util.stream.Stream;

class StreamUtils {
    static <ARG1, ARG2, RESULT> Stream<RESULT> zip(
            Stream<ARG1> s1,
            Stream<ARG2> s2,
            BiFunction<ARG1, ARG2, RESULT> combiner) {
        final var i2 = s2.iterator();
        return s1.map(x1 -> i2.hasNext() ? combiner.apply(x1, i2.next()) : null)
                .takeWhile(Objects::nonNull);
    }
}

এখানে কিছু ইউনিট পরীক্ষার কোড রয়েছে (কোডের চেয়ে অনেক বেশি দীর্ঘ!)

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.assertEquals;

class StreamUtilsTest {
    @ParameterizedTest
    @MethodSource("shouldZipTestCases")
    <ARG1, ARG2, RESULT>
    void shouldZip(
            String testName,
            Stream<ARG1> s1,
            Stream<ARG2> s2,
            BiFunction<ARG1, ARG2, RESULT> combiner,
            Stream<RESULT> expected) {
        var actual = StreamUtils.zip(s1, s2, combiner);

        assertEquals(
                expected.collect(Collectors.toList()),
                actual.collect(Collectors.toList()),
                testName);
    }

    private static Stream<Arguments> shouldZipTestCases() {
        return Stream.of(
                Arguments.of(
                        "Two empty streams",
                        Stream.empty(),
                        Stream.empty(),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.empty()),
                Arguments.of(
                        "One singleton and one empty stream",
                        Stream.of(1),
                        Stream.empty(),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.empty()),
                Arguments.of(
                        "One empty and one singleton stream",
                        Stream.empty(),
                        Stream.of(1),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.empty()),
                Arguments.of(
                        "Two singleton streams",
                        Stream.of("blah"),
                        Stream.of(1),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.of(pair("blah", 1))),
                Arguments.of(
                        "One singleton, one multiple stream",
                        Stream.of("blob"),
                        Stream.of(2, 3),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.of(pair("blob", 2))),
                Arguments.of(
                        "One multiple, one singleton stream",
                        Stream.of("foo", "bar"),
                        Stream.of(4),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.of(pair("foo", 4))),
                Arguments.of(
                        "Two multiple streams",
                        Stream.of("nine", "eleven"),
                        Stream.of(10, 12),
                        (BiFunction<Object, Object, Object>) StreamUtilsTest::combine,
                        Stream.of(pair("nine", 10), pair("eleven", 12)))
        );
    }

    private static List<Object> pair(Object o1, Object o2) {
        return List.of(o1, o2);
    }

    static private <T1, T2> List<Object> combine(T1 o1, T2 o2) {
        return List.of(o1, o2);
    }

    @Test
    void shouldLazilyEvaluateInZip() {
        final var a = new AtomicInteger();
        final var b = new AtomicInteger();
        final var zipped = StreamUtils.zip(
                Stream.generate(a::incrementAndGet),
                Stream.generate(b::decrementAndGet),
                (xa, xb) -> xb + 3 * xa);

        assertEquals(0, a.get(), "Should not have evaluated a at start");
        assertEquals(0, b.get(), "Should not have evaluated b at start");

        final var takeTwo = zipped.limit(2);

        assertEquals(0, a.get(), "Should not have evaluated a at take");
        assertEquals(0, b.get(), "Should not have evaluated b at take");

        final var list = takeTwo.collect(Collectors.toList());

        assertEquals(2, a.get(), "Should have evaluated a after collect");
        assertEquals(-2, b.get(), "Should have evaluated b after collect");
        assertEquals(List.of(2, 4), list);
    }
}

আমি takeWhileশেষের দিকে ড্রপটি ফেলেছিলাম যা জাভা 8 বলে মনে হচ্ছে না তবে এটি কোনও সমস্যা নয় কারণ জেলিড স্ট্রিমগুলি একই আকারের না হলে কলি কোনও নাল ফিল্টার করতে পারে। আমি মনে করি যে এটি উত্তর এবং বোধগম্য হওয়ায় এই উত্তরটি 1 নম্বর উত্তর হওয়া উচিত। মহান কাজ আবার ধন্যবাদ।
simbo1905

1
public class Tuple<S,T> {
    private final S object1;
    private final T object2;

    public Tuple(S object1, T object2) {
        this.object1 = object1;
        this.object2 = object2;
    }

    public S getObject1() {
        return object1;
    }

    public T getObject2() {
        return object2;
    }
}


public class StreamUtils {

    private StreamUtils() {
    }

    public static <T> Stream<Tuple<Integer,T>> zipWithIndex(Stream<T> stream) {
        Stream<Integer> integerStream = IntStream.range(0, Integer.MAX_VALUE).boxed();
        Iterator<Integer> integerIterator = integerStream.iterator();
        return stream.map(x -> new Tuple<>(integerIterator.next(), x));
    }
}

1

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

 List<Tuple2<Integer,Integer>> list =  ReactiveSeq.of(1,2,3,4,5,6)
                                                  .zip(Stream.of(100,200,300,400));


  List<Tuple2<Integer,Integer>> list = StreamUtils.zip(Stream.of(1,2,3,4,5,6),
                                                  Stream.of(100,200,300,400));

এটি আরও সাধারণ প্রয়োগকৃত ভিত্তিক জিপিংয়ের প্রস্তাব দেয়। যেমন

   ReactiveSeq.of("a","b","c")
              .ap3(this::concat)
              .ap(of("1","2","3"))
              .ap(of(".","?","!"))
              .toList();

   //List("a1.","b2?","c3!");

   private String concat(String a, String b, String c){
    return a+b+c;
   }

এমনকি প্রতিটি আইটেমকে এক স্ট্রিমে অন্য আইটেমের সাথে জুড়ানোর ক্ষমতা

   ReactiveSeq.of("a","b","c")
              .forEach2(str->Stream.of(str+"!","2"), a->b->a+"_"+b);

   //ReactiveSeq("a_a!","a_2","b_b!","b_2","c_c!","c2")

0

কারও StreamEx.zipWithযদি এটির এখনও প্রয়োজন হয় তবে স্ট্রিমেক্স লাইব্রেরিতে ফাংশন রয়েছে :

StreamEx<String> givenNames = StreamEx.of("Leo", "Fyodor")
StreamEx<String> familyNames = StreamEx.of("Tolstoy", "Dostoevsky")
StreamEx<String> fullNames = givenNames.zipWith(familyNames, (gn, fn) -> gn + " " + fn);

fullNames.forEach(System.out::println);  // prints: "Leo Tolstoy\nFyodor Dostoevsky\n"

-1

এটা অসাধারণ. আমাকে একটি মানচিত্রে দুটি স্ট্রিম জিপ করতে হয়েছিল যার সাথে একটি স্ট্রিম মূল এবং অন্যটিটির মান

Stream<String> streamA = Stream.of("A", "B", "C");
Stream<String> streamB  = Stream.of("Apple", "Banana", "Carrot", "Doughnut");    
final Stream<Map.Entry<String, String>> s = StreamUtils.zip(streamA,
                    streamB,
                    (a, b) -> {
                        final Map.Entry<String, String> entry = new AbstractMap.SimpleEntry<String, String>(a, b);
                        return entry;
                    });

System.out.println(s.collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue())));

আউটপুট: {এ = অ্যাপল, বি = কলা, সি = গাজর}

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