আমার একটা মানচিত্র দরকার ফাংশন । জাভাতে এর আগেও কি এরকম কিছু আছে?
(যারা অবাক করে তাদের জন্য: আমি অবশ্যই এই তুচ্ছ কাজটি কীভাবে নিজে প্রয়োগ করতে পারি তা জানি ...)
আমার একটা মানচিত্র দরকার ফাংশন । জাভাতে এর আগেও কি এরকম কিছু আছে?
(যারা অবাক করে তাদের জন্য: আমি অবশ্যই এই তুচ্ছ কাজটি কীভাবে নিজে প্রয়োগ করতে পারি তা জানি ...)
উত্তর:
জেডিকে জাভা 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);
Collections2.transform(input -> Integer.toHexString(intput.intValue())
জাভা 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()
।
toList()
। বিভিন্ন ধরণের প্রতিস্থাপন:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
সাথে প্রতিস্থাপন করা যাবে doMap
?
foo::doMap
বা কিছু Foo::doMap
।
ফাংশনাল জাভা নামে একটি দুর্দান্ত গ্রন্থাগার রয়েছে যা আপনি জাভা পেতে চান এমন অনেকগুলি বিষয় পরিচালনা করে কিন্তু তা দেয় না। তারপরে আবারও, এই দুর্দান্ত ভাষা স্কালার রয়েছে যা জাভা করা উচিত ছিল সমস্ত কিছু করে কিন্তু এখনও জেভিএম-এর জন্য লিখিত কোনও কিছুর সাথে সামঞ্জস্যপূর্ণ নয়।
a.map({int i => i + 42});
তারা কি সংকলকটি প্রসারিত করেছিল? বা প্রিপ্রোসেসর যুক্ত?
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 যখন ল্যাম্বডাস নিয়ে আসে তখন এটি অচল হয়ে যায়।
এটি আর একটি কার্যকরী লিব যা দিয়ে আপনি মানচিত্রটি ব্যবহার করতে পারেন: http://code.google.com/p/totallylazy/
sequence(1, 2).map(toString); // lazily returns "1", "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);