উত্তর:
নাহ, আপনি ব্যতিক্রম ছোঁড়া ছাড়াই একটি "প্রতিটি" বাতিল করতে পারবেন না। আপনি যদি কোনও বিশেষ অবস্থার অধীনে বিরতি বাতিল করতে চান তবে আপনি সম্ভবত একটি ক্লাসিক লুপ চান।
বিকল্পভাবে, আপনি প্রতিটির পরিবর্তে একটি "সন্ধান" বন্ধ করতে পারেন এবং যখন আপনি কিছুটা বিরতি করতেন তখন সত্য ফিরে আসতে পারেন।
পুরো উদাহরণটি প্রক্রিয়া করার আগে এই উদাহরণটি বাতিল করা হবে:
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
ছাপে
1
2
3
4
5
তবে 6 বা 7 মুদ্রণ করে না।
এটি আপনার নিজের পুনরাবৃত্ত পদ্ধতিগুলি কাস্টম ব্রেকের আচরণের সাথে লিখতেও সহজ যা ক্লোজারগুলি গ্রহণ করে:
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
এছাড়াও মুদ্রণ:
1
2
3
4
5
find
বেশী ভালো any
- নিচের অন্যান্য উত্তর দেখার @Michal থেকে আমার জন্য এক কাজ
def test = [2] test.findResult{ it * 2 }
2-র পরিবর্তে 4 ফিরবে
যে কোনও বন্ধের সাথে প্রতিটি লুপ প্রতিস্থাপন করুন ।
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
return true // break
}
আউটপুট
1
3
any()
এইভাবে ব্যবহার করা কিছুটা বিভ্রান্তিকর, তবে এটি অবশ্যই কাজ করে এবং আপনাকে বিরতি বা চালিয়ে যাওয়ার ক্ষমতা দেয় ।
না, আপনি ব্যতিক্রম ছুঁড়ে না দিয়ে গ্রোভির কোনও বন্ধ থেকে ভাঙতে পারবেন না। এছাড়াও, নিয়ন্ত্রণ প্রবাহের জন্য আপনার ব্যতিক্রম ব্যবহার করা উচিত নয়।
আপনি যদি নিজেকে কোনও বন্ধ হয়ে যেতে চান বলে মনে করেন তবে প্রথমে আপনি কেন এটি করতে চান এবং এটি কীভাবে করবেন না তা নিয়ে আপনার প্রথমে চিন্তা করা উচিত। গ্রোভির (ধারণাগত) উচ্চতর অর্ডার ফাংশনগুলির মধ্যে একটিতে প্রশ্নে প্রথমে বিবেচনা করা বন্ধের বিকল্প হতে পারে consider নিম্নলিখিত উদাহরণ:
for ( i in 1..10) { if (i < 5) println i; else return}
হয়ে
(1..10).each{if (it < 5) println it}
হয়ে
(1..10).findAll{it < 5}.each{println it}
যা স্বচ্ছতাতেও সহায়তা করে। এটি আপনার কোডের অভিপ্রায়টিকে আরও ভালভাবে জানিয়েছে।
প্রদর্শিত উদাহরণগুলির মধ্যে সম্ভাব্য ত্রুটি হ'ল পুনরাবৃত্তি কেবল প্রথম উদাহরণের প্রথমদিকে থামে। আপনার যদি পারফরম্যান্স বিবেচনা করে থাকেন তবে আপনি এটিকে তত্ক্ষণাত বন্ধ করতে চাইতে পারেন।
তবে, বেশিরভাগ ব্যবহারের ক্ষেত্রে যা পুনরাবৃত্তির সাথে জড়িত থাকে আপনি সাধারণত গ্রোভির সন্ধান, গ্রেপ, সংগ্রহ, ইনজেকশন ইত্যাদি পদ্ধতিতে অবলম্বন করতে পারেন। তারা সাধারণত কিছু "কনফিগারেশন" নেয় এবং তারপরে আপনার জন্য পুনরাবৃত্তি কীভাবে করবেন তা "জানুন", যাতে আপনি সম্ভবত যেখানেই সম্ভব অপরিহার্য লুপিং এড়াতে পারেন।
সবে বিশেষ ক্লোজার ব্যবহার করছি
// declare and implement:
def eachWithBreak = { list, Closure c ->
boolean bBreak = false
list.each() { it ->
if (bBreak) return
bBreak = c(it)
}
}
def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
if (it > 3) return true // break 'eachWithBreak'
println it
return false // next it
}
(1..10) .each {
যদি (এটি <5)
এটি মুদ্রণ
আর
মিথ্যা প্রত্যাবর্তন
each
, এটি কেবল 4-এর চেয়ে বড় মানগুলি মুদ্রণ করে না The else
এটি অতিমাত্রায় হয়, আপনার কোডটি এটি ছাড়াই একই কাজ করে। এছাড়াও, আপনি প্রমাণ করতে পারেন যে আপনি ঠিক পরে এবং ঠিক আগে রাখলে each
তা ভেঙে যায় না । return false
println "not breaking"
else
return false
আপনি দ্বারা বিরতি করতে পারে RETURN
। উদাহরণ স্বরূপ
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
এটা আমার জন্য কাজ করে!
any
ফিরে এসে অ্যারের পদ্ধতিটি ভাঙ্গতে পারেন false
। আপনি each
একই পদ্ধতিতে ভাঙ্গতে পারবেন না ।