জাভা 8 এ স্ট্রিম ব্যবহার করে কোনও পূর্ণসংখ্যা থেকে সর্বাধিক মান কীভাবে পাওয়া যায়?


96

আমার একটি তালিকা রয়েছে Integer listএবং list.stream()আমি সর্বোচ্চ মান চাই from সহজ উপায় কি? আমার কি তুলনামূলক দরকার?


4

15
আপনার কাছে কোনও স্ট্রিম ব্যবহার করার কারণ থাকতে পারে তবে ভুলে যাবেন না Collections.max..
অ্যালেক্সিস সি

উত্তর:


209

আপনি হয় স্ট্রিম রূপান্তর করতে পারেন IntStream:

OptionalInt max = list.stream().mapToInt(Integer::intValue).max();

অথবা প্রাকৃতিক অর্ডার তুলনাকারী নির্দিষ্ট করুন:

Optional<Integer> max = list.stream().max(Comparator.naturalOrder());

বা ব্যবহার হ্রাস অপারেশন:

Optional<Integer> max = list.stream().reduce(Integer::max);

বা সংগ্রাহক ব্যবহার করুন:

Optional<Integer> max = list.stream().collect(Collectors.maxBy(Comparator.naturalOrder()));

বা ইন্টারস্মমেরি স্ট্যাটিস্টিকস ব্যবহার করুন:

int max = list.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();

16
কোনটি আরও দক্ষ তা জানতে আগ্রহী হবে।
রোল্যান্ড

4
আমি জিজ্ঞাসা করতে পারি কেন, তাগীর?
নির্বাচন করুন

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

আপনি যদি কেবল একটি পেতে চান intতবে mapToInt(...).max().getAsInt()বা reduce(...).get()পদ্ধতি শৃঙ্খলে
Andrejs

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

11
int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

9
এটি কেবল তখনই কাজ করে যদি আপনার সমস্ত মানগুলি ইতিবাচক হয়। হ্রাস () হ্রাস 0 এর পরিবর্তে পূর্ণসংখ্যা ব্যবহার করুন।
রোলিকা


3

সঠিক কোড:

int max = list.stream().reduce(Integer.MIN_VALUE, (a, b) -> Integer.max(a, b));

বা

int max = list.stream().reduce(Integer.MIN_VALUE, Integer::max);

0

স্ট্রিম এবং হ্রাস সঙ্গে

Optional<Integer> max = list.stream().reduce(Math::max);

দেখে মনে হচ্ছে আপনি এই উত্তরটি দু'বার পোস্ট করেছেন এবং অপরটি মুছে ফেলেছেন, তবে আমি অন্যটির উপর যেমন মন্তব্য করেছি, এই সমাধানটি ইতিমধ্যে তাগিরের উত্তরে অন্তর্ভুক্ত রয়েছে ( Integer::maxতবে তবে এটি ঠিক একই)।
দিদিয়ের এল

0

আপনি স্নিপড কোড নীচেও ব্যবহার করতে পারেন:

int max = list.stream().max(Comparator.comparing(Integer::valueOf)).get();

অন্য বিকল্প:

list.sort(Comparator.reverseOrder()); // max value will come first
int max = list.get(0);  

0
int value = list.stream().max(Integer::compareTo).get();
System.out.println("value  :"+value );

4
অন্যান্য উত্তরগুলি রয়েছে যা ওপির প্রশ্ন সরবরাহ করে এবং এগুলি বহু বছর আগে পোস্ট করা হয়েছিল। উত্তর পোস্ট করার সময়, দয়া করে নিশ্চিত হন যে আপনি কোনও নতুন সমাধান যুক্ত করেছেন, বা যথেষ্ট উত্তম ব্যাখ্যা, বিশেষত পুরানো প্রশ্নের উত্তর দেওয়ার সময়।
help-info.de

-2

আপনি ইন্ট ম্যাক্স = স্ট্রিম.ওফ (1,2,3,4,5) ব্যবহার করতে পারেন ( ধনাত্মক এবং negativeণাত্মক উভয় সংখ্যার জন্য কাজ করে


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