জাভা 8 স্ট্রিম এপিআইতে গণনা করে গ্রুপ করুন


170

আমি গোষ্ঠীকরণের জন্য জাভা 8 স্ট্রিম এপিআইতে একটি সহজ উপায় সন্ধান করার চেষ্টা করি, আমি এই জটিল উপায়ে আসি!

List<String> list = new ArrayList<>();

list.add("Hello");
list.add("Hello");
list.add("World");

Map<String, List<String>> collect = list.stream().collect(
        Collectors.groupingBy(o -> o));
System.out.println(collect);

List<String[]> collect2 = collect
        .entrySet()
        .stream()
        .map(e -> new String[] { e.getKey(),
                String.valueOf(e.getValue().size()) })
        .collect(Collectors.toList());

collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));

আমি আপনার ইনপুট প্রশংসা করি।


1
আপনি এখানে কি অর্জন করার চেষ্টা করছেন?
কেপিল

2
এটি একটি খুব সাধারণ ঘটনা, উদাহরণস্বরূপ আমি একটি সময়ের মধ্যে একটি ত্রুটি ঘটেছিলাম এবং আমি এই সময়ের মধ্যে প্রতিদিন প্রতিদিন সংখ্যার পরিমাণ সম্পর্কে কিছু পরিসংখ্যান দেখতে চাই।
মুহাম্মদ হেউডি

উত্তর:


340

আমি মনে করি আপনি কেবল ওভারলোডের সন্ধান করছেন যা Collectorপ্রতিটি গ্রুপের সাথে কী করা উচিত ... এবং তারপরে গণনাটি করতে অন্যটিকে লাগে Collectors.counting():

import java.util.*;
import java.util.stream.*;

class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("Hello");
        list.add("Hello");
        list.add("World");

        Map<String, Long> counted = list.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

        System.out.println(counted);
    }
}

ফলাফল:

{Hello=2, World=1}

( groupingByConcurrentআরও দক্ষতার জন্য ব্যবহার করার সম্ভাবনাও রয়েছে your আপনার আসল কোডটির জন্য মনে রাখার মতো কিছু যদি এটি আপনার প্রসঙ্গে সুরক্ষিত থাকে))


1
পারফেক্ট! ... জাভাডোক থেকেand then performing a reduction operation on the values associated with a given key using the specified downstream Collector
মুহাম্মদ হেউডি

6
ই -> এর পরিবর্তে ফাংশন.সিডিয়েনটি () (স্ট্যাটিক আমদানি সহ) ব্যবহার করে এটি পড়তে একটু সুন্দর করে তোলে: মানচিত্র <স্ট্রিং, লং> কাউন্ট = লিস্ট স্ট্রিম () সংগ্রহ করুন (গ্রুপিংবি (পরিচয় (), গণনা () ));
কুচি

হাই, আমি ভাবছিলাম যে কেউ কোডের মানচিত্রের দিকটি ব্যাখ্যা করতে পারে Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));, ঠিক এই মুহুর্তে কী ঘটছে এবং প্রেরিত হতে পারে এমন বিষয়ের সাথে সম্পর্কিত আরও ব্যাখ্যা সহ কোনও লিঙ্ক
খালি

@Blank: এটা মত আর আপনি ব্যাখ্যা যা অংশগুলি আপনার সাথে একটি নতুন প্রশ্ন শ্রেষ্ঠ হিসাবে, হবে যে না প্রথম বুঝতে। এর প্রতিটি দিক দিয়ে যেতে (কোন বিটটি আপনি বুঝতে পারছেন না তা বুঝতে না পেরে) খুব দীর্ঘ সময় লাগবে - আমি এই মুহুর্তে 5 বছরেরও বেশি পুরানো কোনও উত্তর দিতে ইচ্ছুক নয়, যখন আপনি তার বেশিরভাগই ইতিমধ্যে বুঝতে পারে।
জন স্কিটি

@ জোনস্কিট শীতল, আমি এটিকে একটি নতুন প্রশ্নে ফেলব, যদিও আমি আমার প্রশ্নে যে দিকটি বুঝতে পারি নি তা তুলে ধরেছি। এটি হ'ল, এটি সহ আমি পুরো কোড স্নিপেট যুক্ত করেছি।
ফাঁকা

9
List<String> list = new ArrayList<>();

list.add("Hello");
list.add("Hello");
list.add("World");

Map<String, List<String>> collect = list.stream()
                                        .collect(Collectors.groupingBy(o -> o));
collect.entrySet()
       .forEach(e -> System.out.println(e.getKey() + " - " + e.getValue().size()));

8

বস্তুর তালিকার উদাহরণ এখানে

Map<String, Long> requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting()));

8

হাতে টাস্কটি সম্পাদনের জন্য এখানে কিছুটা ভিন্ন বিকল্প রয়েছে।

ব্যবহার toMap:

list.stream()
    .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact));

ব্যবহার Map::merge:

Map<String, Integer> accumulator = new HashMap<>();
list.forEach(s -> accumulator.merge(s, 1, Math::addExact));


1

আপনি একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার খোলা হন, তাহলে আপনি ব্যবহার করতে পারেন Collectors2মধ্যে বর্গ অন্ধকার সংগ্রহগুলি রূপান্তর করতে Listএকটি থেকে Bagএকটি ব্যবহার Stream। এ Bagহ'ল ডেটা স্ট্রাকচার যা গণনা করার জন্য তৈরি

Bag<String> counted =
        list.stream().collect(Collectors2.countBy(each -> each));

Assert.assertEquals(1, counted.occurrencesOf("World"));
Assert.assertEquals(2, counted.occurrencesOf("Hello"));

System.out.println(counted.toStringOfItemToCount());

আউটপুট:

{World=1, Hello=2}

এই বিশেষ ক্ষেত্রে, আপনি সরাসরি একটি collectমধ্যে Listসরাসরি করতে পারেন Bag

Bag<String> counted = 
        list.stream().collect(Collectors2.toBag());

আপনি Bagএকটি গ্রাহক সংগ্রহ সংগ্রহ প্রোটোকল সঙ্গে Streamঅভিযোজিত ব্যবহার না করে তৈরি করতে পারেন List

Bag<String> counted = Lists.adapt(list).countBy(each -> each);

বা এই বিশেষ ক্ষেত্রে:

Bag<String> counted = Lists.adapt(list).toBag();

আপনি কেবল সরাসরি ব্যাগটি তৈরি করতে পারেন।

Bag<String> counted = Bags.mutable.with("Hello", "Hello", "World");

এ এটির Bag<String>মতো Map<String, Integer>যা এটি অভ্যন্তরীণভাবে কী এবং তাদের সংখ্যা গণনা করে। তবে, যদি আপনি Mapএমন কীটির জন্য জিজ্ঞাসা করেন যার মধ্যে এটি থাকে না তবে তা ফিরে আসবে null। যদি আপনি Bagএমন কী ব্যবহার করে যা occurrencesOfএটি ব্যবহার করে না তবে এটি 0 ফিরে আসবে।

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

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