কোটলিন টার্নারি শর্তসাপেক্ষ অপারেটর


উত্তর:


616

কোটলিনে, ifবিবৃতিগুলি হল অভিব্যক্তি। সুতরাং নিম্নলিখিত কোড সমতুল্য:

if (a) b else c

ভাব এবং বিবৃতি মধ্যে পার্থক্য এখানে গুরুত্বপূর্ণ। জাভা / সি # / জাভাস্ক্রিপ্টে, ifএকটি বিবৃতি গঠন করে, যার অর্থ এটি কোনও মানকে সমাধান করে না। আরও দৃ concrete়ভাবে, আপনি এটিকে কোনও ভেরিয়েবলের জন্য বরাদ্দ করতে পারবেন না।

// Valid Kotlin, but invalid Java/C#/JavaScript
var v = if (a) b else c

আপনি যদি এমন ভাষা থেকে এসে থাকেন যেখানে ifবিবৃতি থাকে তবে এটিকে অস্বাভাবিক মনে হতে পারে তবে শীঘ্রই এই অনুভূতিটি হ্রাস পাবে।


57
অতিরিক্তভাবে আপনি ব্যবহার করতে পারেন when
বাশোর

5
কেবল যোগ করতে, এটি যদি বুলিয়ান এক্সপ্রেশন হয় তবে x = a==b
আপনিও

2
@ মাইকআরল্যান্ডার উত্তরটি স্পষ্ট করার জন্য আমি প্রসারিত করেছি। এই বিষয়টি চিহ্নিত করার জন্য ধন্যবাদ.
ড্রয় নোকস

1
@ আদিলআনসারী না, এটি সংশোধন করছে না। এটা আরও খারাপ। এই তুলনা করুন। b + if (a) c else dবনাম b + (c if (a) else d)। দ্বিতীয়টির জন্য অতিরিক্ত বন্ধনী প্রয়োজন। কারণ cশর্তটি দ্বারা আবদ্ধ নয় এবং else
নাতিমুল

1
এই বিষয়টি সম্পর্কে এখানে একটু আলোচনা করা হল। আলোচনার জন্য.কোটলিনলং.রোগ / টি
এফ। নরবার্ট

70

আপনি আপনার নিজের সংজ্ঞায়িত করতে পারে Booleanএক্সটেনশন ফাংশন যা রিটার্ন nullযখন Booleanহয় falseএকটি কাঠামো তিন অপারেটর অনুরূপ প্রদান:

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

এটি এর a ? b : cমত একটি অভিব্যক্তি অনুবাদ করে তুলবে a then b ?: c:

println(condition then "yes" ?: "no")

আপডেট: তবে জাভা-জাতীয় আরও কিছু শর্তসাপেক্ষ সুইচ করতে আপনার এমন কিছু প্রয়োজন হবে

infix fun <T> Boolean.then(param: () -> T): T? = if (this) param() else null

println(condition then { "yes" } ?: "no") ল্যাম্বডায় মনোযোগ দিন। এর বিষয়বস্তু হিসাব যতক্ষণ না আমরা নিশ্চিত করতে স্থগিত করা উচিত নিশ্চিত conditionহয়true

এইটিকে আনাড়ি মনে হচ্ছে, এ কারণেই কোটলিনে জাভা টের্নারি অপারেটরটি বন্দর করার জন্য উচ্চ চাহিদা রয়েছে বলে অনুরোধ রয়েছে


1
infix inline fun<T> Boolean.then(param: ()->T):T? = if(this) param() else null
নালবিতে

3
<টি: যে কোনও> ব্যবহার করুন, অন্যথায় এটি ভুলভাবে কাজ করবে:true then { null } ?: "not-null"
ইউজিন পেট্রেনকো

BTW, ?:অপারেটর এখানে elvis-operator: kotlinlang.org/docs/reference/null-safety.html#elvis-operator
এরিক ওয়াং

64

টি এল; ডিআর

if (a) b else c

আপনি তিনটি অপারেটর এক্সপ্রেশন পরিবর্তে কি ব্যবহার করতে পারেন a ? b : c


Kotlin অনেক নিয়ন্ত্রণ বিবৃতি সহ if, whenবা এমনকি tryহিসাবে ব্যবহার করা যেতে পারে এক্সপ্রেশন । এর অর্থ এই যে এর ফলস্বরূপ একটি ভেরিয়েবল বরাদ্দ করা যায়, কোনও ফাংশন থেকে ফিরে আসা যায় can

সিনট্যাক্টিক্যালি, টের্নারি অপারেটরের দরকার নেই

কোটলিনের অভিব্যক্তির ফলস্বরূপ, ভাষার সত্যিকার অর্থে টের্নারি অপারেটরের প্রয়োজন নেই

if (a) b else c

আপনি তিনটি অপারেটর এক্সপ্রেশন পরিবর্তে কি ব্যবহার করতে পারেন a ? b : c

আমি মনে করি ধারণাটিটি হ'ল পূর্বের অভিব্যক্তিটি আরও পঠনযোগ্য কারণ সবাই জানেন যে কী ifelseকরে, তবে ? :যদি আপনি ইতিমধ্যে বাক্যবিন্যাসের সাথে পরিচিত না হন তবে এটি অস্পষ্ট।

তবুও, আমাকে স্বীকার করতে হবে যে আমি প্রায়শই বেশি সুবিধাজনক টার্নারি অপারেটরটি মিস করি ।


অন্যান্য বিকল্প

কখন

whenশর্তাদি যাচাই করা হয় এমন সময় আপনি কোটলিনে ব্যবহৃত কনস্ট্রাক্টগুলিও দেখতে পাবেন । এটি যদি অন্যভাবে ক্যাসকেডগুলি বিকল্প উপায়ে প্রকাশ করারও একটি উপায়। নিম্নলিখিতটি ওটি উদাহরণগুলির সাথে মিলে যায়।

when(a) {
    true -> b
    false -> c
}

এক্সটেনশানগুলি

অন্যান্য উত্তরের হিসাবে অনেক ভাল উদাহরণ ( কোটলিন টার্নারি কন্ডিশনাল অপারেটর ) দেখায়, এক্সটেনশনগুলিও আপনার ব্যবহারের ক্ষেত্রে সমাধানের ক্ষেত্রে সহায়তা করতে পারে।


36

নিজের জন্য আমি নিম্নলিখিত এক্সটেনশন ফাংশনগুলি ব্যবহার করি:

fun T?.or<T>(default: T): T = if (this == null) default else this 
fun T?.or<T>(compute: () -> T): T = if (this == null) compute() else this

প্রথমটি প্রদত্ত ডিফল্ট মান ফেরত দেবে যদি বস্তুর শূন্য হয়। দ্বিতীয় একই ক্ষেত্রে ল্যাম্বডায় প্রদত্ত প্রকাশের মূল্যায়ন করবে।

ব্যবহার:

1) e?.getMessage().or("unknown")
2) obj?.lastMessage?.timestamp.or { Date() }

ব্যক্তিগতভাবে আমার জন্য কোডটি ifনির্মাণের ইনলাইনিংয়ের চেয়ে বেশি পঠনযোগ্য above


34
এটি প্রশ্নের সাথে প্রাসঙ্গিক নয়, তবে কেন ব্যবহার করবেন না ?: , এলভিস অপারেটর ? প্রথম ফাংশনটি প্রতিস্থাপন করা হবে e.getMessage() ?: "unknown"। দ্বিতীয়টি হিসাবে প্রকাশ করা যেতে পারেobj?.lastMessage?.timestamp ?: { Date() }()
হটকি

1
@ হটকি এর জন্য কোনও বিশেষ উদ্দেশ্য নেই। আমার দৃষ্টিকোণ থেকে এটি চেইন অপারেশনগুলিতে আরও সামঞ্জস্যপূর্ণ এবং দৃশ্যমান কম কোলাহল দেখাচ্ছে কারণ আপনার বন্ধনীগুলিতে নির্মাণ মোড়ানো উচিত নয়
রুक्स

14
@ruX এলভিস অপারেটরটি বিশেষত এর জন্য এবং আপনার ব্যবহারটি অস্বাভাবিক।
জেইসন মিনার্ড

6
যদিও?: ঠিক আছে, আসুন পার্লের রাস্তা থেকে খুব বেশি দূরে যাই না।
রিচার্ড হ্যাভেন

29

জাভা এর সমতুল্য টার্নারি অপারেটর

a ? b : c

এক লাইনে কোটলিনে একটি সাধারণ আইএফ

if(a) b else c

সেখানে কোনও টের্নারি অপারেটর নেই (শর্ত? তাহলে: অন্যথায়), কারণ সাধারণ যদি এই ভূমিকাতে ভাল কাজ করে।

https://kotlinlang.org/docs/reference/control-flow.html#if-expression


নুল তুলনার জন্য বিশেষ ক্ষেত্রে

আপনি এলভিস অপারেটর ব্যবহার করতে পারেন

if ( a != null ) a else b
// equivalent to
a ?: b

28

নেই কোন তিন অপারেটর kotlin মধ্যে, যেমন if elseব্লক আয় মান

সুতরাং, আপনি করতে পারেন: val max = if (a > b) a else b জাভা এর পরিবর্তেmax = (a > b) ? b : c

আমরা নির্মাণও ব্যবহার করতে পারি when, এটি মানও ফেরত দেয়:

val max = when(a > b) {
    true -> a
    false -> b
}

কোটলিন ডকুমেন্টেশনের লিঙ্কটি এখানে: কন্ট্রোল ফ্লো: যদি, কখন, কখন, কিছুক্ষণ


27

কোটলিনে, ifএকটি অভিব্যক্তি, অর্থাত্ এটি একটি মান দেয়। অতএব কোনও টের্নারি অপারেটর নেই (condition ? then : else), কারণ সাধারণ যদি এই ভূমিকাতে সূক্ষ্মভাবে কাজ করে। এখান থেকে ম্যানুয়াল উত্স

// Traditional usage 
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}

// As expression 
val max = if (a > b) a else b

26

কয়েকটি উত্তরের ক্ষেত্রে অন্যান্য উত্তরে উল্লেখ নেই।

চেহারাও যেহেতু takeIf মধ্যে Kotlin 1.1 তিন অপারেটর a ? b : cএই মত প্রকাশ করা যেতে পারে:

b.takeIf { a } ?: c

সি এর ক্ষেত্রে এটি আরও খাটো হয়ে যায় null:

b.takeIf { a }

এছাড়াও নোট করুন যে জাভা বিশ্বে সাধারণ নাল চেকগুলি value != null ? value : defaultValueআদর্শিক কোটলিনে কেবল অনুবাদ করতে অনুবাদ করে value ?: defaultValue

অনুরূপ a != null ? b : cঅনুবাদ করা যেতে পারে a?.let { b } ?: c


6
এর b.takeIf { a } ?: cচেয়ে খাটো এবং আরও পাঠযোগ্য কীভাবে if (a) b else c? টেরনেরে অপারেটর অবশ্যই কোটলিনে একটি অনুপস্থিত বৈশিষ্ট্য কারণ পরিবর্তনশীল নাম এবং শর্তটি দীর্ঘ হতে পারে এবং আপনাকে লাইনটি খারাপ করে দেয় যা খারাপ
জাভাদ সাদেকজাদেহ

1
এটিও লক্ষ করা উচিত যে takeIfসর্বদা সত্য-কেসকে মূল্যায়ন করে (এখানে a)। যদি aমিথ্যা বলে মনে হয় তবে কেবল এই অভিব্যক্তিটিকে অকারণে গণনা করা যাবে না, তবে আপনি স্মার্ট ক্যাসেটলা থেকে উপকার করতে পারবেন না if (a is Int) { a + 3 }
TheOperator

@ ওপরেটর, ভুল { a }অলসভাবে মূল্যায়ন করা ল্যাম্বদা।
ভাদজিম

1
আমি এটি ভুল লিখেছি, "সর্বদা সত্য-কেস (এখানে b) মূল্যায়ন করা উচিত" হওয়া উচিত । তবে এমনকি { a }, অলসতার সময়ও , অভিব্যক্তিটির ফলাফল নির্ধারণের জন্য অবশ্যই মূল্যায়ন করা উচিত
TheOperator

24

দস্তাবেজগুলি একবার দেখুন :

কোটলিনে, যদি একটি অভিব্যক্তি হয়, অর্থাত্ এটি একটি মান দেয়। অতএব সেখানে কোনও টের্নারি অপারেটর নেই (শর্ত? তাহলে: অন্যথায়), কারণ সাধারণ যদি এই ভূমিকাতে ভাল কাজ করে।



12

কাজ :

আসুন নিম্নলিখিত উদাহরণটি বিবেচনা করুন:

if (!answer.isSuccessful()) {
    result = "wrong"
} else {
    result = answer.body().string()
}
return result

আমাদের কোটলিনে নিম্নলিখিত সমতুল্য প্রয়োজন:

রিটার্ন (! answer.isSuccessful ()) ? "ভুল" : answer.body ()। স্ট্রিং ()


সমাধান :

1. একটি । আপনি if-expressionকোটলিনে ব্যবহার করতে পারেন :

return if (!answer.isSuccessful()) "wrong" else answer.body().string()

1. বি । আপনি এটি ফ্লিপ করলে এটি আরও ভাল হতে পারে if-expression(আসুন এটি ছাড়াই করুন not):

return if (answer.isSuccessful()) answer.body().string() else "wrong"

। কোটলিনের এলভিস অপারেটর ?:আরও ভাল একটি কাজ করতে পারে:

return answer.body()?.string() ?: "wrong"

। অথবা Extension functionসংশ্লিষ্ট Answerশ্রেণীর জন্য একটি ব্যবহার করুন :

fun Answer.bodyOrNull(): Body? = if (isSuccessful()) body() else null

। এটি ব্যবহার করে Extension functionআপনি কোনও কোডকে ধন্যবাদ হ্রাস করতে পারেন Elvis operator:

return answer.bodyOrNull()?.string() ?: "wrong"

। অথবা কেবল whenঅপারেটর ব্যবহার করুন :

when (!answer.isSuccessful()) {
    parseInt(str) -> result = "wrong"
    else -> result = answer.body().string()
}

আশাকরি এটা সাহায্য করবে.


11

যখন সি-জাতীয় ভাষার স্যুইচ অপারেটরকে প্রতিস্থাপন করে। সর্বাধিক ফর্ম এ এটির মতো দেখাচ্ছে

when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
        print("x is neither 1 nor 2")
    }
}

3
সত্য, তবে আপনি যে উদাহরণটি দেখান তার whenকোনও বক্তব্য হিসাবে নয়, বিবৃতি হিসাবে রয়েছে । ত্রৈমাসিকিক শর্তসাপেক্ষ অভিব্যক্তিগুলির সাথে আরও প্রাসঙ্গিক তুলনা হ'ল প্রতিটি শাখাকে একটি মূল্য ফেরত দেওয়া হবে, যেমন সম্পূর্ণ যখন অভিব্যক্তি একটি মূল্যকে মূল্যায়ণ করে (যেমন ত্রিশটি শর্তসাপেক্ষে ঘটে)।
ড্রয় নোকস

9

কোটলিনে কোনও টেনারি অপারেটর নেই। এটি প্রথম নজরে সমস্যাযুক্ত বলে মনে হচ্ছে। তবে ভাবেন আমরা অন্য কোনও বিবৃতি যদি ইনলাইন দিয়ে এটি করতে পারি কারণ এটি এখানে প্রকাশ। কেবল আমাদের করতে হবে -

var number = if(n>0) "Positive" else "Negetive"

আমাদের প্রয়োজন মতো অনেকগুলি ব্লক করা হলে আমরা এখানে অন্য কিছু করতে পারি। Like-

var number = if(n>0) "Positive" else if(n<0) "Negative" else "Zero"

সুতরাং এই লাইনটি টেনারি অপারেটরের তুলনায় এত সহজ এবং বেশি পঠনযোগ্য। যখন আমরা জাভাতে একাধিক ত্রিনিরি অপারেটর ব্যবহার করি তখন তা ভয়াবহ বলে মনে হয়। তবে এখানে আমাদের একটি পরিষ্কার বাক্য গঠন রয়েছে। এমনকি আমরা এটি একাধিক লাইনেও লিখতে পারি।


9

আপনি var a= if (a) b else cটার্নারি অপারেটরের জায়গায় ব্যবহার করতে পারেন ।

কোটলিনের আরেকটি ভাল ধারণা এলভিস অপারেটর। আপনার প্রতিবার নাল পরীক্ষা করার দরকার নেই।

val l = b?.length ?: -1

এটি দৈর্ঘ্যটি ফিরিয়ে আনবে যদি বি শূন্য না হয় অন্যথায় এটি ডান পাশের বিবৃতি কার্যকর করে।


7

ড্রু নোকসের উদ্ধৃতি অনুসারে, কোটলিন যদি বিবৃতি হিসাবে অভিব্যক্তি হিসাবে ব্যবহার করে, সুতরাং টেরনারির শর্তসাপেক্ষ অপারেটরটির আর প্রয়োজন হয় না,

তবে এক্সটেনশন ফাংশন এবং ইনফিক্স ওভারলোডিংয়ের সাহায্যে আপনি নিজে এটি প্রয়োগ করতে পারেন, এখানে একটি উদাহরণ

infix fun <T> Boolean.then(value: T?) = TernaryExpression(this, value)

class TernaryExpression<out T>(val flag: Boolean, val truly: T?) {
    infix fun <T> or(falsy: T?) = if (flag) truly else falsy
}

তারপরে এটি ব্যবহার করুন

val grade = 90
val clazz = (grade > 80) then "A" or "B"

হতে পারে <T> আরও ভাল? ইনফিক্স মজা বা (মিথ্যা: টি?) = যদি (পতাকা) সত্যই অন্য মিথ্যা
একক

1
তবে যোগ করুন <টি> এটি কার্যকর করতে পারে: (গ্রেড> 80) তারপর নাল বা "বি"
একা

এটি সত্যিই দুর্দান্ত, আমি এটি ব্যবহার করতে যাচ্ছি: পি তবে মনে রাখবেন যে, আমি ভুল না হলে এটি প্রতিবার যখনই বলা হয় তখন কোনও বস্তুর বরাদ্দ ঘটায়। একটি বিশাল চুক্তি নয়, তবে এটি জিরো ব্যয়ের বিমূর্ততা নয় তা জানা মূল্য।
আদম

6

আর একটি আকর্ষণীয় পদ্ধতির ব্যবহার হবে when:

when(a) {
  true -> b
  false -> b
}

আরও কিছু জটিল পরিস্থিতিতে বেশ সহজ হতে পারে। এবং সত্যই, এটি আমার চেয়ে বেশি পঠনযোগ্যif ... else ...


6

আপনি কোটলিনে এটি অনেক উপায়ে করতে পারেন

  1. ব্যবহার করে যদি

    if(a) b else c
  2. ব্যবহার করার সময়

    when (a) { 
        true -> print("value b") 
        false -> print("value c") 
        else -> {  
            print("default return in any other case") 
        } 
    }
  3. নাল সুরক্ষা

    val a = b ?: c

5

কোটলিনে কোনও টিনারারি অপারেশন নেই তবে এর আশপাশে কাজ করার কিছু মজার উপায় রয়েছে। অন্যরা যেমন উল্লেখ করেছে, কোটলিনে সরাসরি অনুবাদ এটির মতো দেখাবে:

val x = if (condition) result1 else result2

তবে, ব্যক্তিগতভাবে, আমার মনে হয় যে এটি কিছুটা বিশৃঙ্খল এবং পড়ার পক্ষে শক্ত হয়ে উঠতে পারে। লাইব্রেরিতে নির্মিত আরও কয়েকটি অপশন রয়েছে। আপনি এলভিস অপারেটরের সাথে টেকআইফ {use ব্যবহার করতে পারেন:

val x = result1.takeIf { condition } ?: result2

সেখানে যা ঘটছে তা হ'ল টেকআইফ}} আদেশটি আপনার ফলাফল 1 বা নালটি প্রদান করে এবং এলভিস অপারেটর নাল বিকল্পটি পরিচালনা করে। কিছু অতিরিক্ত বিকল্প রয়েছে, নিরবিচ্ছিন্ন {take, উদাহরণস্বরূপ:

val x = result1.takeUnless { condition } ?: result2

ভাষাটি পরিষ্কার, আপনি জানেন যে এটি কী করছে।

যদি এটি সাধারণভাবে ব্যবহৃত শর্ত হয় তবে আপনি কোনও মজাদার কিছু করতে পারেন যেমন একটি ইনলাইন এক্সটেনশন পদ্ধতি ব্যবহার করুন। ধরা যাক আমরা উদাহরণস্বরূপ কোনও গেমের স্কোর ট্র্যাক করতে চাই, এবং প্রদত্ত শর্তটি পূরণ না হলে আমরা সর্বদা 0 ফিরে আসতে চাই:

inline fun Int.zeroIfFalse(func: () -> Boolean) : Int = if (!func.invoke()) 0 else this     

ঠিক আছে, কুৎসিত মনে হচ্ছে। তবে এটি কখন ব্যবহৃত হবে তা বিবেচনা করুন:

var score = 0
val twoPointer = 2
val threePointer = 3

score += twoPointer.zeroIfFalse { scoreCondition } 
score += threePointer.zeroIfFalse { scoreCondition } 

আপনি দেখতে পাচ্ছেন, কোটলিন আপনি কীভাবে আপনার কোডটি প্রকাশ করতে পছন্দ করেন তাতে অনেক নমনীয়তার প্রস্তাব দেয়। আমার উদাহরণগুলির অসংখ্য বৈচিত্র রয়েছে এবং সম্ভবত আমি এখনও আবিষ্কারও করতে পারি নি। আশা করি এটা কাজে লাগবে!


takeIfসত্যিই আমার প্রিয় বিকল্পটি, খুব মার্জিত।
জাভিয়ের মেন্ডোনিয়া

4

মনে রাখবেন টার্নারি অপারেটর এবং এলভিস অপারেটর অনেক জনপ্রিয় ভাষায় ভিন্ন ভিন্নভাবে কোটলিনে পৃথক অর্থ ধারণ করে। এরকম expression? value1: value2আপনার দ্বারা গালি দিতে হবে Kotlin অন্য কোন ভাষা মতো কম্পাইলার যেমন আছে Kotlin কোন তিন অপারেটর উল্লেখ হিসাবে সরকারী দস্তাবেজ । কারণটি হ'ল যদি, যখন এবং চেষ্টা করার মতামতগুলি নিজেরাই মানগুলি ফিরিয়ে দেয়।

সুতরাং, করছেন expression? value1: value2দ্বারা প্রতিস্থাপন করা যেতে পারে

ভাল সর্বাধিক = যদি (ক> খ) মুদ্রণ ("একটি চয়ন করুন") অন্য মুদ্রণ করুন ("বি বেছে নিন")

কোলটিনের যে এলভিস অপারেটর রয়েছে কেবল সেগুলি কেবল প্রনামযোগ্য ভেরিয়েবলের ক্ষেত্রে কাজ করে:

আমি ভালো কিছু করতে হলে value3 = value1 ?: value2তারপর যদি মান 1 হয় নাল তারপর VALUE2 প্রত্যাবর্তিত হবে না অন্যথায় মান 1 প্রত্যাবর্তিত হবে না।

এই উত্তরগুলি থেকে আরও সুস্পষ্ট বোঝাপড়া অর্জন করা যায় ।


3

আপনি এর ifজন্য কোটলিনে এক্সপ্রেশন ব্যবহার করতে পারেন । কোটলিনে ifফলাফল মান সহ একটি অভিব্যক্তি। কোটলিনে আমরা লিখতে পারি

fun max(a: Int, b: Int) = if (a > b) a else b

এবং জাভাতে আমরা একই অর্জন করতে পারি তবে বৃহত্তর কোড সহ

int max(int a, int b) {
return a > b ? a : b
}

2

যদি আপনি মানক স্বরলিপিটি কী ব্যবহার করেন তা না করে আপনি ইনফিক্স ব্যবহার করে এটি তৈরি / অনুকরণও করতে পারেন কিছু দিয়ে করতে পারেন:

আপনার লক্ষ্য এবং ফলাফল ধরে রাখতে একটি শ্রেণী তৈরি করুন:

data class Ternary<T>(val target: T, val result: Boolean)

একটি বার্ষিক ক্রিয়াকলাপ অনুকরণ করতে কিছু infix ফাংশন তৈরি করুন

infix fun <T> Boolean.then(target: T): Ternary<T> {
    return Ternary(target, this)
}

infix fun <T> Ternary<T>.or(target: T): T {
    return if (this.result) this.target else target
}

তারপরে আপনি এটির মতো এটি ব্যবহার করতে সক্ষম হবেন:

val collection: List<Int> = mutableListOf(1, 2, 3, 4)

var exampleOne = collection.isEmpty() then "yes" or "no"
var exampleTwo = (collection.isNotEmpty() && collection.contains(2)) then "yes" or "no"
var exampleThree = collection.contains(1) then "yes" or "no"

এটি একটি আসল টেরিনারি অপারেটরের সম্পূর্ণরূপে সমতুল্য হওয়ার জন্য, লক্ষ্য মানগুলি লাম্বদা সরবরাহকারী টিও হতে পারে
আরান এর ওল্ড ম্যান

1

ব্যবহারের জন্য আরও একটি সংক্ষিপ্ত পদ্ধতির

val value : String = "Kotlin"

value ?: ""

এখানে কোটলিন নিজেই নাল মানটি পরীক্ষা করে এবং যদি এটি নাল হয় তবে এটি খালি স্ট্রিংয়ের মানটি পাস করে।


1

কেন কেউ এই জাতীয় কিছু ব্যবহার করবে:

when(a) {
  true -> b
  false -> b
}

যখন আপনি আসলে এই জাতীয় কিছু ব্যবহার করতে পারেন ( aএই ক্ষেত্রে বুলিয়ান):

when {
  a -> b
  else -> b
}

1
কারণ প্রথমটি শব্দার্থগতভাবে পরিষ্কার এবং অন্য কারও কাছে এটি সহজেই বোধগম্য, যদিও তারা ডাব্লু / কোটলিন পরিচিত না, যদিও ২ য় নম্বরটি নয় not
mc01

1
ঠিক আছে, আপনি পয়েন্টটি পেয়ে গেছেন, তবে আমি বুঝতে পারি না কোটলিন বিকাশকারীরা কেন বার্ষিক ভাব প্রকাশ করেনি
ZZ 5

আমি মনে করি ? and :প্রকারের চেকের পরিবর্তে অযোগ্য / প্রকারের ঘোষণার সাথে বৈপরীত্য। তা ছাড়া আমি কোনও কারণ দেখতে পাচ্ছি না। আমি মনে করি কেউ অবশ্যই অবশ্যই কিছু চিন্তাভাবনা করতেন, যদি ইনলাইন থাকে তবে-অন্য শর্তটি পরীক্ষা করা উচিত। আসুন অপেক্ষা করুন এবং ভবিষ্যতের সংস্করণগুলিতে দেখুন।
bh4r4th

1

প্রয়োগ () এর সাথে কাজ করার সময়, টের্নারি অপারেশনগুলির সাথে ডিল করার সময় খুব সহজ মনে হয়, কারণ এটি আরও মার্জিত এবং আপনাকে ঘর দেয়

val columns: List<String> = ...
val band = Band().apply {
    name = columns[0]
    album = columns[1]
    year = columns[2].takeIf { it.isNotEmpty() }?.let { it.toInt() } ?: 0
}

0

নিম্নলিখিত ইনফিক্স ফাংশনগুলির সাহায্যে আমি পাইথনের ক্ষেত্রে অনেকগুলি সাধারণ ব্যবহারের ক্ষেত্রে এটি একইভাবে কভার করতে পারি:

class TestKotlinTernaryConditionalOperator {

    @Test
    fun testAndOrInfixFunctions() {
        Assertions.assertThat(true and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(false and "yes" or "no").isEqualTo("no")

        Assertions.assertThat("A" and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat("" and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(1 and "yes" or "no").isEqualTo("yes")
        Assertions.assertThat(0 and "yes" or "no").isEqualTo("no")

        Assertions.assertThat(Date() and "yes" or "no").isEqualTo("yes")
        @Suppress("CAST_NEVER_SUCCEEDS")
        Assertions.assertThat(null as Date? and "yes" or "no").isEqualTo("no")
    }
}

infix fun <E> Boolean?.and(other: E?): E? = if (this == true) other else null
infix fun <E> CharSequence?.and(other: E?): E? = if (!(this ?: "").isEmpty()) other else null
infix fun <E> Number?.and(other: E?): E? = if (this?.toInt() ?: 0 != 0) other else null
infix fun <E> Any?.and(other: E?): E? = if (this != null) other else null
infix fun <E> E?.or(other: E?): E? = this ?: other

0

কোটলিনে কোনও শ্রেনী অপারেটর নেই, সর্বাধিক বন্ধ হ'ল নীচের দুটি ক্ষেত্রে,

  • এক্সপ্রেশন স্টেটমেন্ট হিসাবে অন্যথায় যদি

val a = true if(a) print("A is true") else print("A is false")

  • এলভিস অপারেটর

যদি?: এর বাম দিকে অভিব্যক্তি নাল না হয় তবে এলভিস অপারেটর এটিকে ফিরিয়ে দেয়, অন্যথায় এটি এক্সপ্রেশনটি ডানে প্রত্যাবর্তন করে। নোট করুন যে ডান হাতের এক্সপ্রেশনটি কেবল তখনই বাম-হাতের অংশটি নਾਲ হলে মূল্যায়ন করা হয়।

 val name = node.getName() ?: throw IllegalArgumentException("name expected")

রেফারেন্স ডক্স


0

উদাহরণস্বরূপ: var শক্তি: অন্তর্গত = ডেটা? .get (অবস্থান)? energy শক্তি? .toInt ()?: 0

Kotlin আপনি ব্যবহার করেন তাহলে ? এটা পছন্দ যদি বিবৃতি তারপর নাল ফিরে আসবে কাজ করবে ?: 0 0 যত্ন নিতে সাহায্য করতে যাই হোক না কেন আপনি এই পার্শ্ব লিখুন আছে।


-1

কোটলিনে আপনি এর মতো টের্নারি অপারেশন ব্যবহার করতে পারেন: val x = if(a) "add b" else "add c"


1
এই প্রশ্নের ইতিমধ্যে যথেষ্ট উত্তর দেওয়া হয়েছে, এবং সম্প্রতি আপডেট করা হয়নি। আগের উত্তরগুলির চেয়ে আলাদা নয় এখন অন্য উত্তর পোস্ট করার দরকার নেই।
হেডক্র্যাকার

-2

অন্যান্য ধারণাগুলি সম্পর্কে কিছু গবেষণা করার পরে, আমি নিম্নলিখিত টার্নারি অপারেটরটি পেয়েছি:

infix fun <T : Any> Boolean.yes(trueValue: T): T? = if (this) trueValue else null
infix fun <T : Any> T?.no(falseValue: T): T = this ?: falseValue

উদাহরণ ( এখানে চালানো ):

fun main() {
    run {
        val cond = true
        val result = cond yes "True!" no "False!"
        println("ternary test($cond): $result")
    }
    run {
        val cond = false
        val result = cond yes "True!" no "False!"
        println("ternary test($cond): $result")
    }
}

এই সংস্করণটি সাবলীল এবং নাল কোলেসিং অপারেটরের সাথে বিরোধ নয়।


এটি ডিভেন্টের উত্তরের মতো যেখানে এটির thenপরিবর্তে নামকরণ হয়েছে yes
রাই-

@ রে হ্যাঁ, এবং আমি নিশ্চিত নই যে তারা একই ব্যক্তি কিনা তবে বিকল্পগুলির সাথে ইনফিক্স পদ্ধতি ব্যবহার করার ধারণাটি কোটলিন ফোরাম থেকে এসেছে। আমি যা দেখিনি তা হ'ল 'না' পদ্ধতিটি আমি নিয়ে এসেছি কারণ আমি নাল কোলেসিং অপারেটরকে বিভ্রান্তিমূলকভাবে ইনলাইন ব্যবহার দেখতে পাই কারণ বেশিরভাগ ভাষায় শর্তের পরিবর্তে প্রশ্ন চিহ্নটি 'তত্ক্ষণিক মান' এর পরে থাকে।
ব্রায়ান ডাব্লু ওয়াগনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.