প্রবাহে জাভা 8 ফোরচ লুপ ব্যবহার করে পরবর্তী আইটেমটিতে যান


126

জাভা 8 প্রবাহের স্ট্রিমটিতে আমার সমস্যা আছে লুপের পরবর্তী আইটেমটিতে যাওয়ার চেষ্টা করছে। আমি কমান্ডটি সেট করতে পারি না continue;, কেবলমাত্র return;কাজ করে তবে আপনি এই ক্ষেত্রে লুপ থেকে প্রস্থান করবেন। আমাকে লুপে পরবর্তী আইটেমটি চালিয়ে নেওয়া দরকার। আমি এটা কিভাবে করবো?

উদাহরণ (কাজ করছে না):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
            filteredLines = lines.filter(...).foreach(line -> {
           ...
           if(...)
              continue; // this command doesn't working here
    });
}

উদাহরণ (কাজ):

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
    filteredLines = lines.filter(...).collect(Collectors.toList());
}

for(String filteredLine : filteredLines){
   ...
   if(...)
      continue; // it's working!
}

দয়া করে একটি পূর্ণ তবে ন্যূনতম উদাহরণ পোস্ট করুন যাতে উত্তর দেওয়া সহজ হয়।
তুনাকি

আমাকে লুপে পরবর্তী আইটেমটি চালিয়ে নেওয়া দরকার।
ভিক্টর ভি।

2
তার বক্তব্যটি হল, আপনি যে কোডটি দেখিয়েছেন সেটির continueসাথে এখনও কোনও কার্যকরী পরিবর্তন ছাড়াই পরবর্তী আইটেমটির দিকে সরানো হবে না।
18:55

যদি কলটি চালিয়ে যাওয়ার জন্য আগত লাইনগুলি সম্পাদন করা এড়ানো এবং আপনি আমাদের প্রদর্শন করছেন না, তবে এই সমস্ত লাইন একটি elseব্লকে রেখে দিন in যদি এর পরে আর কিছু continueনা থাকে তবে ইফ ব্লক এবং চালিয়ে যান: এগুলি অকেজো।
জেবি নিজত

উত্তর:


278

ব্যবহার করা return;ঠিক কাজ করবে। এটি সম্পূর্ণ লুপটি সম্পূর্ণ হতে বাধা দেবে না। এটি কেবল forEachলুপের বর্তমান পুনরাবৃত্তি সম্পাদন বন্ধ করবে ।

নিম্নলিখিত ছোট প্রোগ্রাম চেষ্টা করুন:

public static void main(String[] args) {
    ArrayList<String> stringList = new ArrayList<>();
    stringList.add("a");
    stringList.add("b");
    stringList.add("c");

    stringList.stream().forEach(str -> {
        if (str.equals("b")) return; // only skips this iteration.

        System.out.println(str);
    });
}

আউটপুট:

একটি

পুনরাবৃত্তির return;জন্য কীভাবে কার্যকর করা হয় তা লক্ষ্য করুন b, তবে cনীচের পুনরাবৃত্তির উপর প্রিন্ট করুন ঠিক আছে।

কেন এই কাজ করে?

প্রথমে আচরণটি অপ্রয়োজনীয় বলে মনে করার কারণটি হ'ল আমরা returnপুরো পদ্ধতির প্রয়োগে বাধা দেওয়ার বিবৃতিতে অভ্যস্ত। সুতরাং এক্ষেত্রে আমরা আশা করি mainপুরো পদ্ধতিটি কার্যকরভাবে বন্ধ হয়ে যাবে।

তবে, যা বোঝার দরকার তা হ'ল ল্যাম্বডা এক্সপ্রেশন, যেমন:

str -> {
    if (str.equals("b")) return;

    System.out.println(str);
}

... mainএটি সুবিধামত এর অভ্যন্তরে অবস্থিত হওয়া সত্ত্বেও, এটি নিজস্ব স্বতন্ত্র "পদ্ধতি" হিসাবে বিবেচনা করা প্রয়োজন, পদ্ধতি থেকে সম্পূর্ণ পৃথক । সুতরাং সত্যই, returnবিবৃতিটি কেবল ল্যাম্বডা এক্সপ্রেশনটির কার্য সম্পাদন বন্ধ করে দেয়।

দ্বিতীয় জিনিসটি যা বোঝার দরকার তা হ'ল:

stringList.stream().forEach()

... সত্যিই কভারগুলির নীচে কেবলমাত্র একটি সাধারণ লুপ যা প্রতিটি পুনরাবৃত্তির জন্য ল্যাম্বডা এক্সপ্রেশনটি কার্যকর করে।

এই 2 টি বিষয়টিকে মাথায় রেখে, উপরের কোডটি নিম্নলিখিত সমমানের পদ্ধতিতে (কেবলমাত্র শিক্ষাগত উদ্দেশ্যে) পুনরায় লেখা যেতে পারে:

public static void main(String[] args) {
    ArrayList<String> stringList = new ArrayList<>();
    stringList.add("a");
    stringList.add("b");
    stringList.add("c");

    for(String s : stringList) {
        lambdaExpressionEquivalent(s);
    }
}

private static void lambdaExpressionEquivalent(String str) {
    if (str.equals("b")) {
        return;
    }

    System.out.println(str);
}

এই "কম যাদু" কোড সমতুল্য হওয়ার সাথে, returnবিবৃতিটির পরিধি আরও সুস্পষ্ট হয়ে যায়।


3
আমি ইতিমধ্যে এইভাবে চেষ্টা করেছি এবং কোনওভাবে এটি কাজ করে না, আমি আবার এই কৌশলটি পুনরাবৃত্তি করেছি এবং এটি কাজ করছে working ধন্যবাদ, এটি আমাকে সাহায্য করে। দেখে মনে হচ্ছে আমি কেবলমাত্র বেশি কাজ করেছি =)
ভিক্টর ভি।

2
একটি যাদুমন্ত্র মত কাজ করে! কেন আপনি দয়া করে এটির ব্যাখ্যা ব্যাখ্যা করতে পারেন?
স্পার্কস্পাইডার

2
@ স্পাইডার: যুক্ত হয়েছে।
সস্তান

5

আরেকটি সমাধান: আপনার উল্টানো অবস্থার সাথে ফিল্টারটি যান: উদাহরণ:

if(subscribtion.isOnce() && subscribtion.isCalled()){
                continue;
}

সঙ্গে প্রতিস্থাপন করা যেতে পারে

.filter(s -> !(s.isOnce() && s.isCalled()))

সর্বাধিক সরল পদ্ধতিতে "রিটার্ন" ব্যবহার করা হবে বলে মনে হচ্ছে যদিও।


2

আপনি যে ল্যাম্বদাটি দিয়ে যাচ্ছেন forEach()তা স্ট্রিম থেকে প্রাপ্ত প্রতিটি উপাদানের জন্য মূল্যায়ন করা হয়। ল্যাম্বদার ক্ষেত্রের মধ্যে থেকে পুনরাবৃত্তিটি দৃশ্যমান নয়, সুতরাং আপনি continueএটি forEach()সি প্রিপ্রসেসর ম্যাক্রোর মতো দেখতে পারবেন না । পরিবর্তে, আপনি শর্তসাপেক্ষে এটিতে থাকা বাকী বিবৃতিগুলি এড়িয়ে যেতে পারেন।


0

আপনি ifচালিয়ে যাওয়ার পরিবর্তে একটি সাধারণ বিবৃতি ব্যবহার করতে পারেন । সুতরাং আপনার কোডটি রাখার পরিবর্তে আপনি চেষ্টা করতে পারেন:

try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
            filteredLines = lines.filter(...).foreach(line -> {
           ...
           if(!...) {
              // Code you want to run
           }
           // Once the code runs, it will continue anyway
    });
}

ইফ স্টেটমেন্টের প্রেডিকেটটি আপনার if(pred) continue;বিবৃতিতে প্রেডিকেটের বিপরীত হবে , সুতরাং কেবল ব্যবহার করুন !(যৌক্তিক নয়)।

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