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


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.