জাভা 8-তে ডেটার একটি তালিকা পরিষ্কার করা


11

ডেটা তালিকা পরিষ্কার করার জন্য, আমি একটি পদ্ধতি তৈরি করেছি যা ডেটা তালিকা এবং পরিস্কার করা অপারেশনগুলির তালিকা গ্রহণ করে।

public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) {
    List<T>dataNew=data.stream().map((str) -> {
        T cleanData = str;
        for(Function<T,T> function:cleanOps) {
            cleanData=function.apply(cleanData);
        }
        return cleanData;
    }).collect(Collectors.toList());
    return dataNew;
}

এখানে সমস্যাটি হ'ল আমরা Collectors.toList()নতুন তালিকাটি ফেরত দেওয়ার সাথে সাথে পুরো তালিকাটি তৈরি করছি । অতিরিক্ত স্থান ব্যবহার না করে আমরা কি একই ফলাফল অর্জন করতে পারি?

নীচে আমন্ত্রণের জন্য কোডটি দেওয়া হল:

public void processData() {
    List<Function<String, String>> cleanOps = new ArrayList<>();
    cleanOps.add(String::toLowerCase);
    cleanOps.add(str -> str.replaceAll(" ", ""));
    List<String> data = new ArrayList<>();
    data.add("John Doe");
    data.add("Jane Doe");
    System.out.println(Arrays.toString(cleanData(data, cleanOps).toArray()));
}

toList()একটি Collectorনা Listএবং না প্রদান করে: আপনার কাছে "অতিরিক্ত স্থান" ছাড়া "অতিরিক্ত ডেটা" থাকতে পারে না
xerx593

উত্তর:


10

যদি তালিকায় স্থান পরিবর্তন করার অনুমতি দেওয়া হয় তবে আপনি ব্যবহার করতে পারেন

public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) {
    cleanOps.stream().reduce(Function::andThen).ifPresent(f -> data.replaceAll(f::apply));
    return data;
}

andThenদুটি Functionউদাহরণ মিশ্রন করে এবং যদি কমপক্ষে একটি ফাংশন উপস্থিত থাকে, তবে cleanOpsতালিকাটি খালি নয়, ফলস্বরূপ সম্মিলিত ফাংশনটি সমস্ত তালিকা উপাদান এবং ফলাফল দ্বারা প্রতিস্থাপিত উপাদানগুলিতে প্রয়োগ করে প্রয়োগ করা হবে replaceAll

দুর্ভাগ্যক্রমে, কার্যকারিতা সমতুল্য হওয়া সত্ত্বেও এর পরিবর্তে replaceAllএকটি প্রয়োজন , সুতরাং আমাদের অ্যাডাপ্টারটি ব্যবহার করতে হবে ।UnaryOperator<T>Function<T,T>f::apply

যেহেতু এই ফাংশনগুলির প্রকারগুলি সমতুল্য, তাই আমরা তালিকাটি পরিবর্তন করতে পারতাম List<UnaryOperator<T>>, তবে তারপরে আমাদের এই সত্যটির মুখোমুখি হতে হবে যে এর andThenজন্য বিশেষায়িত বাস্তবায়ন নেই UnaryOperator, তাই আমাদের প্রয়োজন হবে:

public <T> List<T> cleanData(List<T> data, List<UnaryOperator<T>> cleanOps) {
    cleanOps.stream()
        .reduce((f1,f2) -> t -> f2.apply(f1.apply(t)))
        .ifPresent(data::replaceAll);
    return data;
}

কলারের উত্সটিতে পরিবর্তিত হয়

List<UnaryOperator<String>> cleanOps = new ArrayList<>();
cleanOps.add(String::toLowerCase);
cleanOps.add(str -> str.replaceAll(" ", ""));
List<String> data = new ArrayList<>();
data.add("John Doe");
data.add("Jane Doe");
System.out.println(cleanData(data, cleanOps));

তারপর।

পার্শ্ব নোট হিসাবে, মত একটি নির্মাণ প্রয়োজন নেই

System.out.println(Arrays.toString(cleanData(data, cleanOps).toArray()));

যেহেতু একটি toString()পদ্ধতির Listঠিক একই আউটপুট উত্পাদন করে। যেহেতু println(Object)পদ্ধতিটি toString()স্পষ্টভাবে কল করে , আপনি কেবল এটি ব্যবহার করতে পারেন

System.out.println(cleanData(data, cleanOps));

7

দেখে মনে হচ্ছে আপনার ব্যবহার করা দরকার List.replaceAll()যা এই তালিকার প্রতিটি উপাদানকে সেই উপাদানটিতে প্রদত্ত অপারেটর প্রয়োগের ফলাফলের সাথে প্রতিস্থাপন করে।

public <T> List<T> cleanString(List<T> data, List<Function<T, T>> cleanOps) {
    data.replaceAll(str -> {
        T cleanData = str;
        for (Function<T,T> function : cleanOps) {
            cleanData = function.apply(cleanData);
        }
        return cleanData;
    });
    return data;
}

আমি পদ্ধতি নামান্তর চাই যদিও, যেহেতু এটি জেনেরিক, তাই এটা অগত্যা একটি প্রক্রিয়া নয় Listএর Stringগুলি।

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