জাভা: মানচিত্রের কোন কাজ আছে?


140

আমার একটা মানচিত্র দরকার ফাংশন । জাভাতে এর আগেও কি এরকম কিছু আছে?

(যারা অবাক করে তাদের জন্য: আমি অবশ্যই এই তুচ্ছ কাজটি কীভাবে নিজে প্রয়োগ করতে পারি তা জানি ...)


1
যদি তা না হয় তবে নিজেকে সংজ্ঞায়িত করা তুচ্ছ। তবে আমি মনে করি গুগল এক ডজন বাস্তবায়ন জানে?

2
সদৃশ (বরং ভাল) এ stackoverflow.com/questions/3907412/...
Chowlett

6
@ ক্রিস: একই প্রশ্নটি কেমন?
আলবার্ট

1
যদি এই প্রশ্নের উত্তর হ্যাঁ হয় তবে এটি অন্যান্য লিঙ্কযুক্ত প্রশ্নেরও উত্তর দেয়। উত্তরটি যদি না হয় (এবং এটি এরকম মনে হয়) তবে তারা সম্পূর্ণ সম্পর্কিত নয়।
আলবার্ট

1
জাভা 8 হিসাবে, এটিই হ'ল ডেলান হয়ত লেভেলআপ্লঞ্চ.com
জাভা /

উত্তর:


86

জেডিকে জাভা a হিসাবে কোনও ফাংশনের ধারণা নেই।

পেয়ারাতে একটি ফাংশন ইন্টারফেস রয়েছে এবং পদ্ধতিটি আপনার প্রয়োজনীয় কার্যকারিতা সরবরাহ করে।
Collections2.transform(Collection<E>, Function<E,E2>)

উদাহরণ:

// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
    Collections2.transform(input, new Function<Integer, String>(){

        @Override
        public String apply(final Integer input){
            return Integer.toHexString(input.intValue());
        }
    });
System.out.println(output);

আউটপুট:

[a, 14, 1e, 28, 32]

আজকাল জাভা 8-এর সাথে একটি মানচিত্রের কার্যকারিতা রয়েছে, তাই আমি সম্ভবত কোডটি আরও সংক্ষিপ্তভাবে লিখতে চাই:

Collection<String> hex = input.stream()
                              .map(Integer::toHexString)
                              .collect(Collectors::toList);

8
এটি লক্ষণীয় যে পেয়ারা থাকাকালীন আপনি এটি করতে পারেন, আপনি এটি করতে নাও চাইতে পারেন: Code.google.com/p/guava-libraries/wiki/FunctionalExplained (" গুহাবিশেষ " বিভাগটি পড়ুন)।
অ্যাডাম পার্কিন

2
@ অ্যাডাম পারকিন সত্য, তবে আমি দৃ sure়ভাবে নিশ্চিত যে এটি এর চেয়ে আরও উন্নততর কার্যকরী ধারণাগুলিকে বোঝায়, অন্যথায় তারা প্রথমে ট্রান্সফর্ম ( ) পদ্ধতিগুলি তৈরি করতে পারত না
সান প্যাট্রিক ফ্লয়েড

2
প্রকৃতপক্ষে, না, প্রায়শই কার্যক্ষম আইডিয়োমগুলির সাথে একটি নির্দিষ্ট পারফরম্যান্স হিট হয়, যার কারণে তারা জোর দিয়ে থাকে যে আপনার কেবলমাত্র সুযোগগুলি ব্যবহার করা উচিত যদি আপনি নিশ্চিত হন যে এটি দুটি বাহ্যিক মানদণ্ড পূরণ করেছে: সম্পূর্ণভাবে কোডবেসের জন্য এলওসি-র নেট সঞ্চয়করণ এবং প্রমাণিত অলস মূল্যায়নের কারণে পারফরম্যান্স লাভ (বা কমপক্ষে পারফরম্যান্স হিট নয়)। এগুলির ব্যবহারের বিরুদ্ধে বিতর্ক না করে কেবল এটি নির্দেশ করে যে আপনি যদি যাচ্ছেন তবে আপনার প্রয়োগকারীদের সতর্কতা অবলম্বন করা উচিত।
অ্যাডাম পার্কিন

4
@ সানপ্যাট্রিকফ্লয়েড এখন জাভা 8 বের হয়েছে, ল্যাম্বডাসের সাথে জড়িত একটি উদাহরণ দিয়ে এটি আপডেট করতে চান? লাইকCollections2.transform(input -> Integer.toHexString(intput.intValue())
ড্যানিয়েল লুবারভ

2
@ ড্যানিয়েল জাভা ৮-তে, আমি পেয়ারা দিয়ে এটি করার কোনও কারণ দেখতে পাচ্ছি না। পরিবর্তে আমি লেভেন্টভের জবাবটি চাই
সান প্যাট্রিক ফ্লয়েড

92

জাভা 8 এর পর থেকে, জেডিকে এই করার জন্য কিছু মানক বিকল্প রয়েছে:

Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());

দেখুন java.util.Collection.stream()এবং java.util.stream.Collectors.toList()


140
এটি এতই ভার্বোজ যা আমাকে ভিতরে কষ্ট দেয়।
ন্যাটিক্স

1
@Natix সম্পর্কে একমত toList()। বিভিন্ন ধরণের প্রতিস্থাপন:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
লেভেন্টভ

2
ন্যায়বিচারের e -> doMap(e)সাথে প্রতিস্থাপন করা যাবে doMap?
জামেশফিশার

3
@ জামেশফিশার, হ্যাঁ, এর মতো foo::doMapবা কিছু Foo::doMap
লেভেন্টভ

9
আমার ধারণা, এ কারণেই স্কালার অস্তিত্ব রয়েছে। জাভা 12 অপেক্ষা করার জন্য কিছু পাঠযোগ্য।
জুলিয়ানড

26

ফাংশনাল জাভা নামে একটি দুর্দান্ত গ্রন্থাগার রয়েছে যা আপনি জাভা পেতে চান এমন অনেকগুলি বিষয় পরিচালনা করে কিন্তু তা দেয় না। তারপরে আবারও, এই দুর্দান্ত ভাষা স্কালার রয়েছে যা জাভা করা উচিত ছিল সমস্ত কিছু করে কিন্তু এখনও জেভিএম-এর জন্য লিখিত কোনও কিছুর সাথে সামঞ্জস্যপূর্ণ নয়।


তারা কীভাবে নিম্নলিখিত বাক্য গঠনটি সক্ষম করেছিল তাতে আমি আগ্রহী: a.map({int i => i + 42});তারা কি সংকলকটি প্রসারিত করেছিল? বা প্রিপ্রোসেসর যুক্ত?
আন্দ্রে

@ অ্যান্ড্রে - আপনি নিজেই তাদের জিজ্ঞাসা করতে পারেন বা এটি কীভাবে হয়েছে তা দেখতে সোর্স কোডটি পরীক্ষা করে দেখতে পারেন। এখানে সুত্রে লিঙ্ক দেওয়া হল: functionaljava.org/source
wheaties

1
@ অ্যান্ড্রে: উদাহরণগুলি বিজিজিএ বন্ধের প্রস্তাব থেকে বাক্য গঠন ব্যবহার করে। প্রোটোটাইপ চলাকালীন, এটি এখনও 'অফিসিয়াল' জাভাতে নেই।
পিটার btibraný

@ অ্যান্ড্রে: সিনট্যাক্স জাভাতে ক্লোজারগুলির জন্য প্রস্তাবিত স্পেসিফিকেশনের অংশ (হোমপেজে দ্বিতীয় থেকে শেষ অনুচ্ছেদ দেখুন)। কেবলমাত্র একটি প্রোটোটাইপিকাল বাস্তবায়ন আছে।
মাইকেল বার্গওয়ার্ড

2
স্কেল থ্রেড হাইজ্যাক :( আমি আশা করি যে জাভাপোসেস মেলিং তালিকার মতো হয়ে উঠবে না;)
জর্ন

9

Collections2.transform()পেয়ারা থেকে খুব সাবধানতা অবলম্বন করুন । এই পদ্ধতির সর্বাধিক সুবিধা হ'ল এটির সবচেয়ে বড় বিপদ: এর অলসতা।

ডকুমেন্টেশন দেখুন Lists.transform(), যা আমি বিশ্বাস করি এটিও প্রযোজ্য Collections2.transform():

প্রয়োজন হলে ফাংশনটি অলসভাবে প্রয়োগ করা হয় inv প্রত্যাবর্তিত তালিকার ভিউ হওয়ার জন্য এটি প্রয়োজনীয়, তবে এর অর্থ এই যে ফাংশনটি লিস্টকন্টেনস (জাভা.লাং.অবজেক্ট) এবং তালিকা.হ্যাশকোড () এর মতো বাল্ক ক্রিয়াকলাপের জন্য বহুবার প্রয়োগ করা হবে। এটি ভাল সঞ্চালনের জন্য, ফাংশনটি দ্রুত হওয়া উচিত। প্রত্যাবর্তিত তালিকার যখন ভিউ হওয়ার দরকার নেই তখন অলস মূল্যায়ন এড়াতে, প্রত্যাশিত তালিকাটিকে আপনার পছন্দের নতুন তালিকায় অনুলিপি করুন।

এছাড়াও তাদের দস্তাবেজগুলিতে Collections2.transform()আপনি উল্লেখ করেছেন যে আপনি একটি সরাসরি দৃশ্য পেয়েছেন, উত্স তালিকার সেই পরিবর্তনটি রূপান্তরিত তালিকাকে প্রভাবিত করে। এই ধরণের আচরণটি বিকাশকারী কীভাবে কাজ করে তা বুঝতে না পারলে সমস্যা থেকে ট্র্যাকের সমস্যার সৃষ্টি করতে পারে।

আপনি যদি আরও ধ্রুপদী "মানচিত্র" চান, এটি একবার এবং একবারে চলবে, তবে আপনি FluentIterableগুয়ারা থেকেও ভাল , যা একটি অপারেশন রয়েছে যা আরও সহজ। এখানে এর জন্য গুগলের উদাহরণ দেওয়া হল:

FluentIterable
       .from(database.getClientList())
       .filter(activeInLastMonth())
       .transform(Functions.toStringFunction())
       .limit(10)
       .toList();

transform()এখানে মানচিত্র পদ্ধতি। এটি একই ফাংশন <> "কলব্যাকস" ব্যবহার করে Collections.transform()। আপনি যে তালিকাটি ফিরে পেয়েছেন তা কেবল পঠনযোগ্য তবে copyInto()পঠন-লিখনের তালিকাটি ব্যবহার করতে ব্যবহার করুন।

অন্যথায় অবশ্যই জাভা 8 যখন ল্যাম্বডাস নিয়ে আসে তখন এটি অচল হয়ে যায়।


2

এটি আর একটি কার্যকরী লিব যা দিয়ে আপনি মানচিত্রটি ব্যবহার করতে পারেন: http://code.google.com/p/totallylazy/

sequence(1, 2).map(toString); // lazily returns "1", "2"

: এখানে TotallyLazy কিভাবে ব্যবহার করার জন্য একটি গাইড intrepidis.blogspot.com/2013/07/...
intrepidis

2

যদিও এটি একটি পুরানো প্রশ্ন আমি অন্য একটি সমাধান দেখাতে চাই:

জাভা জেনেরিকস এবং জাভা 8 টি স্ট্রিম ব্যবহার করে কেবল নিজের ক্রিয়াকলাপটি সংজ্ঞায়িত করুন:

public static <S, T> List<T> map(Collection<S> collection, Function<S, T> mapFunction) {
   return collection.stream().map(mapFunction).collect(Collectors.toList());
}

আপনি এই জাতীয় কোড লিখতে পারেন তার চেয়ে:

List<String> hex = map(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.