অ্যারে রূপান্তর করতে ল্যাম্বদা এক্সপ্রেশন / স্ট্রিংয়ের তালিকাটিকে অ্যারে / ইন্টিজের্সের তালিকাতে রূপান্তর করতে


111

যেহেতু জাভা 8 শক্তিশালী ল্যাম্বদা এক্সপ্রেশন নিয়ে আসে,

আমি স্ট্রিংসের একটি তালিকা / অ্যারেটিকে অ্যারে / ইন্টিজার্স, ফ্লোটস, ডাবলস ইত্যাদির তালিকায় রূপান্তর করতে একটি ফাংশন লিখতে চাই ..

সাধারণ জাভাতে এটি যতটা সহজ হবে

for(String str : strList){
   intList.add(Integer.valueOf(str));
}

তবে আমি কীভাবে ল্যাম্বডা দিয়ে একইটি অর্জন করব, স্ট্রিংয়ের একটি অ্যারে দিয়ে পূর্ণসংখ্যার অ্যারেতে রূপান্তরিত করতে পারি।

উত্তর:


128

আপনি সাহায্যকারী পদ্ধতি তৈরি করতে পারেন যা অপারেশনটি ব্যবহার করে Tটাইপের একটি তালিকা (অ্যারে) কে তালিকার (অ্যারে) রূপান্তর করতে পারে ।Umapstream

//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
    return from.stream().map(func).collect(Collectors.toList());
}

//for arrays
public static <T, U> U[] convertArray(T[] from, 
                                      Function<T, U> func, 
                                      IntFunction<U[]> generator) {
    return Arrays.stream(from).map(func).toArray(generator);
}

এবং এটি এর মতো ব্যবহার করুন:

//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));

//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);


নোট যা s -> Integer.parseInt(s)দিয়ে প্রতিস্থাপন করা যেতে পারে Integer::parseInt( পদ্ধতি উল্লেখ দেখুন )


5
আপনি যদি পেয়ারা ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন Lists.transform()
আলেকজান্দ্রোস

খুব ভাল উদাহরণ। ফাংশনটি কোডটিকে আরও বহুমুখী এবং শক্তিশালী করে তোলে। Thks !!!
মার্সেলো রেবুয়াস

127
List<Integer> intList = strList.stream()
                               .map(Integer::valueOf)
                               .collect(Collectors.toList());

5
আপনি এই একটু ব্যাখ্যা করতে পারেন?
আনহেলিগ

1
এটি স্ট্রিংয়ের একটি তালিকা একটি স্ট্রিমে রূপান্তরিত করছে তারপরে তালিকার প্রতিটি উপাদানকে ম্যাপিং / রূপান্তর করে তারপরে একটি তালিকাতে সংগ্রহ করে।
হেমান্টো

5
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, যেহেতু ল্যাম্বডাসের বিন্দু (মূল প্রশ্নটি ল্যাম্বডা এক্সপ্রেশন জিজ্ঞাসা করে) কোনও নতুন ক্রিয়াকলাপ সংজ্ঞায়িত করা এড়ানো to যার উপরে, এই উত্তরটি মার্জিতভাবে বিদ্যমান পূর্ণসংখ্যার :: মানফলের ফাংশনটি ব্যবহার করে
জোনাথন বেন

31

গৃহীত উত্তর থেকে সহায়ক পদ্ধতিগুলির প্রয়োজন নেই। স্ট্রিমগুলি ল্যাম্বডাসের সাথে ব্যবহার করা যেতে পারে বা সাধারণত পদ্ধতি রেফারেন্সগুলি ব্যবহার করে সংক্ষিপ্ত করা যায় । স্ট্রিমগুলি কার্যকরী ক্রিয়াকলাপ সক্ষম করে। map()উপাদানগুলিকে রূপান্তর করে এবং collect(...)বা toArray()স্ট্রিমটিকে আবার অ্যারে বা সংগ্রহের মধ্যে গুটিয়ে দেয়।

ভেঙ্কট সুব্রামণিয়ামের কথা (ভিডিও) আমার থেকে এটি আরও ভাল ব্যাখ্যা করে।

1 এ রূপান্তর List<String>করুনList<Integer>

List<String> l1 = Arrays.asList("1", "2", "3");
List<Integer> r1 = l1.stream().map(Integer::parseInt).collect(Collectors.toList());

// the longer full lambda version:
List<Integer> r1 = l1.stream().map(s -> Integer.parseInt(s)).collect(Collectors.toList());

2 এ রূপান্তর List<String>করুনint[]

int[] r2 = l1.stream().mapToInt(Integer::parseInt).toArray();

3 রূপান্তর String[]করুনList<Integer>

String[] a1 = {"4", "5", "6"};
List<Integer> r3 = Stream.of(a1).map(Integer::parseInt).collect(Collectors.toList());

4 এ রূপান্তর String[]করুনint[]

int[] r4 = Stream.of(a1).mapToInt(Integer::parseInt).toArray();

5 এ রূপান্তর String[]করুনList<Double>

List<Double> r5 = Stream.of(a1).map(Double::parseDouble).collect(Collectors.toList());

6 (বোনাস) এ রূপান্তর int[]করুনString[]

int[] a2 = {7, 8, 9};
String[] r6 = Arrays.stream(a2).mapToObj(Integer::toString).toArray(String[]::new);

অবশ্যই আরও অনেক বৈচিত্র অবশ্যই।

এই উদাহরণগুলির আইডিয়োন সংস্করণও দেখুন । কাঁটাচামচ ক্লিক করতে পারেন এবং তারপরে ব্রাউজারে চালানোর জন্য চালাতে পারেন।


7

সম্পাদনা: মন্তব্যগুলিতে যেমন উল্লেখ করা হয়েছে, এটি অনেক সহজ সংস্করণ: Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray() এইভাবে আমরা একটি তালিকাতে এবং পুরো রূপান্তরটি এড়িয়ে যেতে পারি।


আমি অন্য একটি লাইন সমাধান পেয়েছি, তবে এটি এখনও বেশ ধীর গতিতে (চক্রের জন্য প্রায় 100 গুণ বেশি সময় নেয় - 6000 0 এর অ্যারে পরীক্ষিত)

String[] stringArray = ...
int[] out= Arrays.asList(stringArray).stream().map(Integer::parseInt).mapToInt(i->i).toArray();

এটি কী করে:

  1. অ্যারে.এএসলিস্ট () অ্যারেটিকে একটি তালিকায় রূপান্তর করে
  2. .stream এটিকে স্ট্রিমে রূপান্তরিত করে (মানচিত্র সম্পাদন করার জন্য প্রয়োজনীয়)
  3. .map (পূর্ণসংখ্যা :: পার্সিয়ান্ট) প্রবাহের সমস্ত উপাদানকে পূর্ণসংখ্যায় রূপান্তর করে
  4. .mapToInt (i-> i) সমস্ত পূর্ণসংখ্যাকে ইনসে রূপান্তরিত করে (আপনি কেবলমাত্র পূর্ণসংখ্যার ইচ্ছে করলে আপনাকে এটি করতে হবে না)
  5. .toArray () স্ট্রিমটিকে আবার অ্যারে রূপান্তর করে

13
আপনার 1 এবং 4 পদক্ষেপের দরকার নেই:Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
xehpuk

3

তালিকার জন্য:

List<Integer> intList 
 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());

অ্যারের জন্য:

int[] intArray = Arrays.stream(stringArray).mapToInt(Integer::valueOf).toArray();

2

আপনি ব্যবহার করতে পারেন,

List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");

    Integer[] array = list.stream()
        .map( v -> Integer.valueOf(v))
        .toArray(Integer[]::new);

0

পূর্ববর্তী উত্তরগুলিতে আমি এটি পাইনি, সুতরাং জাভা 8 এবং স্ট্রিম সহ:

রূপান্তর String[]করুন Integer[]:

Arrays.stream(stringArray).map(Integer::valueOf).toArray(Integer[]::new)


-1

আমি স্ট্রিংকে পূর্ণসংখ্যায় রূপান্তর করতে ল্যাম্বডা অপারেশন সহ ম্যাপটোইন্ট () ব্যবহার করেছি

int[] arr = Arrays.stream(stringArray).mapToInt(item -> Integer.parseInt(item)).toArray();

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