জাভা স্ট্রিম সহ কর্মচারীদের তালিকা থেকে যোগদানের নির্দিষ্ট তারিখের আগে এবং পরে কর্মচারী পান


9

আমি Listএর Employeeবিভিন্ন যোগদান তারিখ দিয়ে গুলি। আমি স্ট্রিম ব্যবহার করে তালিকা থেকে যোগদানের নির্দিষ্ট তারিখের আগে এবং পরে কর্মচারী পেতে চাই।

আমি কোড অনুসরণ করার চেষ্টা করেছি,

 List<Employee> employeeListAfter = employeeList.stream()
                .filter(e -> e.joiningDate.isAfter(specificDate))
                .collect(Collectors.toList());

List<Employee> employeeListBefore = employeeList.stream()
        .filter(e -> e.joiningDate.isBefore(specificDate))
        .collect(Collectors.toList());

class Employee{
    int id;
    String name;
    LocalDate joiningDate;
}

একক স্ট্রিমে এটি করার কোনও উপায় আছে কি?


1
আপনি ব্যবহার করতে পারেনpartitioningBy
— কোড_মড

5
আগে এবং পরে - সুতরাং আপনি তারিখে যোগদানকারীদের বাদে সমস্ত কর্মচারী চান?
— 3136

ধরে নেওয়া যাক এটি "কমপক্ষে কোনও কর্মচারী" হয়ে গিয়েছেন, আপনি আগেভাগেই বিভক্ত হয়ে পড়বেন এবং আগে নয়, যত্ন নেবেন না।
— জলি জোকার

উত্তর:


16

আপনি partitioningByনীচের হিসাবে ব্যবহার করতে পারেন ,

Map<Boolean, List<Employee>> listMap = employeeList.stream()
        .collect(Collectors.partitioningBy(e -> e.joiningDate.isAfter(specificDate)));

List<Employee> employeeListAfter = listMap.get(true);
List<Employee> employeeListBefore = listMap.get(false);

পার্টিশনিংয়ের মাধ্যমে এমন কোনও সংগ্রাহক ফিরিয়ে দেয় যা পূর্বাভাস অনুযায়ী ইনপুট উপাদানগুলিকে বিভাজন করে এবং এটিকে একটিতে সংগঠিত করেMap<Boolean, List<T>>

নোট করুন যে এটি কর্মচারীদের সাথে পরিচালনা করবে না specificDate।


1
কোডের ব্যাখ্যাটি দুর্দান্ত হবে।
— বিশ্ব রত্ন

2
সঙ্গে কর্মীদের - এই ঠিক করে না, কি প্রশ্নে কোড আছে specificDateমধ্যে ইচ্ছার জমি falseপার্টিশন কেউ প্রশ্ন মধ্যে কোডে কোথায়
— এন্ড্রোনিকাস

কীভাবে যুক্ত করা সমস্যার specificDate.plusDays(1)সমাধান করে? specificDateএখনও falseঅংশ হবে।
— অ্যান্ড্রোনিকাস

তারপরে এটি trueবিভাজনে থাকবে ...
— অ্যান্ড্রোনিকাস

1
@ অ্যান্ড্রোনিকাস: এই আচরণটি কোনও বাগ বা কোনও বৈশিষ্ট্য কিনা তা কেবল ওপিই জানে। আমার কাছে, কোনও কর্মচারীকে বাইরে না রাখাই নিরাপদ বলে মনে হয়।
— এরিক ডুমিনিল

9

যদি আপনার তালিকায় এন্ট্রি থাকতে পারে যা এতে যোগ দেয়specificDate , তবে আপনি groupingByদরকারী খুঁজে পেতে পারেন :

Map<Integer, List<Employee>> result = employeeList.stream()
    .map(emp -> new AbstractMap.SimpleEntry<>(specificDate.compareTo(emp.getJoiningDate()), emp))
    .collect(Collectors.groupingBy(entry -> entry.getKey() > 0 ? 1 : (entry.getKey() < 0 ? -1 : 0),
            Collectors.mapping(entry -> entry.getValue(), Collectors.toList())));

employeeListAfter = result.get(-1);
employeeListBefore = result.get(1);
employeeListOnSpecificDate = result.get(0);

resultমানচিত্র রয়েছে Employeeঅপেক্ষাকৃত করার অবস্থানে দ্বারা গ্রুপকৃত রেকর্ড specificDateযাতে আপনি পূর্বেই যোগদান বাছাই করতে পারেন, পরে, অথবা নির্দিষ্ট তারিখে।


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
— অ্যান্ড্রোনিকাস

2
-1। আপনি এমন মিথ্যা অনুমান করছেন যা compareToকেবলমাত্র -1, 0 বা 1 প্রদান করবে fact
— মাইকএফএ

1
@ মাইকফাহে এটি নির্দেশ করার জন্য ধন্যবাদ। আমি খুব দ্রুত পরীক্ষা দিয়েছি এবং সিদ্ধান্তে ঝাঁপিয়েছি। রূপান্তরিত বাস্তবায়ন (এবং হঠাৎ এটি জটিল দেখাচ্ছে)।
— ernest_k

2
@ আর্নেস্ট_ কে: আপনি আসলটি ব্যবহার করতে পারেন compareToএবং Integer.signumএটিতে কল করতে পারেন।
— এরিক ডুমিনিল

1
@ জলিজোকার ঠিক আপনারা জানেন না তবে আপনি গিথুবের একটি নির্দিষ্ট লাইনের সাথে লিঙ্ক করতে পারেন: এটি পছন্দ করুন । লাইন নম্বরটিতে ক্লিক করা সরাসরি ইউআরএল পরিবর্তন করে। আপনি যদি ইতিমধ্যে জানতেন বা যত্ন নিচ্ছেন না তবে নির্দ্বিধায় অবহেলা করুন। ;)
— এরিক ডুমিনিল

4

এই নির্দিষ্ট তারিখের সাথে আপনার কর্মচারীদের ফিল্টার আউট করা দরকার। তারপরে আপনি পার্টিশনটি ব্যবহার করতে পারেন:

Map<Boolean, List<Employee>> partitioned = employeeList.stream()
    .filter(e -> !e.joiningDate.equals(specificDate))
    .collect(partitioningBy(e -> e.joiningDate.isAfter(specificDate)));

List<Employee> employeeListAfter = partitioned.get(true);
List<Employee> employeeListBefore = partitioned.get(false);

এটি যদি ভবিষ্যদ্বাণীটি পূরণ করে তবে এর ভিত্তিতে সংগ্রহের মানচিত্র তৈরি করবে।


partitioningBy আজ শিখেছি ।
— বিশ্ব রত্ন

না, আপনি তারিখের সাথে ফিল্টার করতে পারবেন না কারণ এটি কেবলমাত্র নির্দিষ্ট তারিখের সাথে কর্মচারীদের ফিল্টার করবে
— কোড_মোড

@ কোড_মোড ওহ, হ্যাঁ, আমি এটি মিস করেছি, আপনাকে ধন্যবাদ!
— অ্যান্ড্রোনিকাস

2

আপনি পূর্ববর্তী, বর্তমান এবং ভবিষ্যতের তারিখের উপর ভিত্তি করে কর্মীদের তালিকা গোষ্ঠীকরণের জন্য পদ্ধতি ব্যবহার করতে পারেন Collectors.groupingByএবং ব্যবহার করতে পারেনcompareTo

Map<Integer, List<Employee>> result = employeeList.stream()
            .collect(Collectors.groupingBy(e-> e.joiningDate.compareTo(specificDate)< 0 ? -1 : (e.joiningDate.compareTo(specificDate) == 0 ? 0 : 1)));

সুতরাং আউটপুট হবে

key--> -1 ---> will have employees with previous date
key--> 0 ---> will have employees with current date
key--> 1 ---> will have employees with future date
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.