รูปแบบย่อสำหรับ Java ถ้าคำสั่ง


201

ฉันรู้ว่ามีวิธีการเขียนifคำสั่งJava ในรูปแบบย่อ

if (city.getName() != null) {
    name = city.getName();
} else {
    name="N/A";
}

ไม่มีใครรู้วิธีการเขียนแบบสั้นสำหรับ 5 บรรทัดข้างต้นเป็นหนึ่งบรรทัด?



2
ฉันคิดว่าคุณทำให้ifตรรกะของคุณผิดไปตลอดทาง
NPE

7
if (city.getName()!=null){name = city.getName();}else{name="N/A"}
Steve Kuo

9
@SteveKuo มีสามช่องว่างที่คุณสามารถลบได้ ;)
Peter Lawrey

2
if (city.getName()!= null) name = city.getName(); else name="N/A";
Anton Dozortsev

คำตอบ:


423

ใช้ผู้ประกอบการที่ประกอบไปด้วย:

name = ((city.getName() == null) ? "N/A" : city.getName());

ฉันคิดว่าคุณมีเงื่อนไขข้างหลัง - ถ้าเป็นโมฆะคุณต้องการให้ค่าเป็น "N / A"

เกิดอะไรขึ้นถ้าเมืองเป็นโมฆะ? รหัสของคุณ * กระทบกับเตียงในกรณีนั้น ฉันจะเพิ่มการตรวจสอบอื่น:

name = ((city == null) || (city.getName() == null) ? "N/A" : city.getName());

12
+1 แม้ว่าคุณจะมีวงเล็บที่ซ้ำซ้อน ฉันจะเขียนว่า: name = city.getName() == null ? "N/A" : city.getName();
Andres F.

20
เรื่องของสไตล์และรสนิยม: ฉันชอบทำให้การจัดกลุ่มของประโยคบูลีนชัดเจน
duffymo

4
อะไรก็ตาม - ฉันใช้ทฤษฎีบทของ DeMorgan และได้รับสิ่งที่คุณต้องการ ไม่จำเป็นต้องแก้ไขตราบใดที่คุณแสดงตรรกะได้อย่างถูกต้อง
duffymo

2
FYI วงเล็บด้านนอกไม่จำเป็น คุณสามารถทำได้name = city.getName()==null ? "N/A" : city.getName()
Steve Kuo

4
จะไม่String cityName = city.getName();โยนNullPointerExceptionถ้าcity == null? ฉันจึงบอกว่าทางออกกลางของคุณดีที่สุดแน่นอน (PS และฉันเห็นด้วยกับวงเล็บ 'ไม่จำเป็น'! ผู้คนต้องจำไว้ว่า 99% ของการเข้ารหัสกำลังสื่อสารกับผู้อื่น (และตัวคุณในอนาคต) ไม่ใช่ผู้เรียบเรียง - เราจะใช้ c!)
Alex

32

เพื่อหลีกเลี่ยงการโทร.getName()สองครั้งฉันจะใช้

name = city.getName();
if (name == null) name = "N/A";

2
city.setName(null)ในระบบผู้ใช้หลายกับเมืองที่ไม่แน่นอนอาจจะเป็นแทรกแซง คำตอบของคุณจะจัดการกับสิ่งนั้นอย่างเรียบร้อย
emory

27

วิธีที่จะทำกับผู้ประกอบการที่ประกอบไปด้วย:

name = city.getName() == null ? city.getName() : "N/A"

อย่างไรก็ตามฉันเชื่อว่าคุณมีการพิมพ์ผิดในรหัสของคุณด้านบนและคุณหมายถึง:

if (city.getName() != null) ...

23

การ : ผู้ประกอบการใน Java

ใน Java คุณอาจเขียน:

if (a > b) {
  max = a;
}
else {
  max = b;
}

การตั้งค่าตัวแปรเดี่ยวให้เป็นหนึ่งในสองสถานะที่ขึ้นอยู่กับเงื่อนไขเดียวนั้นเป็นการใช้งานทั่วไปของ if-else ที่ทางลัดได้รับการคิดค้นขึ้นมาเพื่อผู้ดำเนินการตามเงื่อนไขหรือไม่? การใช้ตัวดำเนินการตามเงื่อนไขคุณสามารถเขียนตัวอย่างด้านบนใหม่ในบรรทัดเดียวดังนี้

max = (a > b) ? a : b;

(a> b)? a: b; คือนิพจน์ที่คืนค่าหนึ่งในสองค่าคือ a หรือ b มีการทดสอบเงื่อนไข (a> b) ถ้าเป็นจริงค่าแรกจะถูกส่งคืน หากเป็นเท็จค่าที่สองคือ b จะถูกส่งคืน ค่าใดที่ส่งคืนจะขึ้นอยู่กับการทดสอบตามเงื่อนไข a> b เงื่อนไขสามารถเป็นนิพจน์ใด ๆ ที่ส่งคืนค่าบูลีน



18

ฉันมักจะลืมวิธีการใช้ประกอบ?: ternary คำตอบเพิ่มเติมนี้เป็นการเตือนความจำอย่างรวดเร็ว if-then-elseมันเป็นชวเลข

myVariable = (testCondition) ? someValue : anotherValue;

ที่ไหน

  • () ถือ if
  • ? วิธี then
  • : วิธี else

มันเป็นเช่นเดียวกับ

if (testCondition) {
    myVariable = someValue;
} else {
    myVariable = anotherValue;
}

10

คุณสามารถเขียนif, else if, elseคำสั่งในรูปแบบย่อ ตัวอย่างเช่น:

Boolean isCapital = city.isCapital(); //Object Boolean (not boolean)
String isCapitalName = isCapital == null ? "" : isCapital ? "Capital" : "City";      

นี่เป็นรูปแบบย่อของ:

Boolean isCapital = city.isCapital();
String isCapitalName;
if(isCapital == null) {
    isCapitalName = "";
} else if(isCapital) {
    isCapitalName = "Capital";
} else {
    isCapitalName = "City";
}

1
สิ่งนี้ไม่ถูกถามดังนั้นจึงยังคง -1
Makky

8

1.คุณสามารถลบวงเล็บและแบ่งบรรทัด

if (city.getName() != null) name = city.getName(); else name = "N/A";

2.คุณสามารถใช้?:ตัวดำเนินการใน java

ไวยากรณ์:

Variable = Condition ? BlockTrue : BlockElse;

ดังนั้นในรหัสของคุณคุณสามารถทำสิ่งนี้:

name = city.getName() == null ? "N/A" : city.getName();

3.กำหนดผลลัพธ์เงื่อนไขสำหรับบูลีน

boolean hasName = city.getName() != null;

พิเศษ: สำหรับอยากรู้อยากเห็น

ในบางภาษาที่JAVAคล้ายGroovyกันคุณสามารถใช้ไวยากรณ์นี้:

name = city.getName() ?: "N/A";

โอเปอเรเตอร์?:กำหนดค่าที่ส่งคืนจากตัวแปรที่เราต้องการ ในกรณีนี้ค่าของถ้ามันไม่ได้city.getName()null



3
name = ( (city.getName() == null)? "N/A" : city.getName() );

ประการแรกเงื่อนไข(city.getName() == null)การตรวจสอบ ถ้าใช่แล้ว"N/A"จะถูกกำหนดให้ชื่อหรือเพียงname="N/A"หรืออื่น ๆ ค่าจากที่ได้รับมอบหมายให้เป็นชื่อคือcity.getName()name=city.getName()

สิ่งที่ต้องระวังที่นี่:

  1. เงื่อนไขอยู่ในวงเล็บตามด้วยเครื่องหมายคำถาม (city.getName() == null)?นั่นเป็นเหตุผลที่ผมเขียน ที่นี่เครื่องหมายคำถามจะอยู่หลังเงื่อนไข ง่ายต่อการดู / อ่าน / เดาแม้!
  2. ค่าที่เหลือของโคลอน ( :) และค่าที่เหมาะสมของโคลอน (a) ค่าที่เหลือของโคลอนจะถูกกำหนดเมื่อเงื่อนไขเป็นจริงมิฉะนั้นค่าที่ถูกต้องของโคลอนจะถูกกำหนดให้กับตัวแปร

นี่คือข้อมูลอ้างอิง: http://www.cafeaulait.org/course/week2/43.html


3

นี่คือหนึ่งบรรทัดรหัส

name = (city.getName() != null) ? city.getName() : "N/A";

นี่คือตัวอย่างวิธีการทำงานเรียกใช้โค้ดด้านล่างในไฟล์ js และทำความเข้าใจกับผลลัพธ์ นี่("Data" != null)คือเงื่อนไขที่เราทำตามปกติif()และ"Data"เป็นคำสั่งเมื่อเงื่อนไขนี้เป็นจริง การ" : "กระทำนี้เป็นอย่างอื่นและ"N/A"เป็นคำสั่งสำหรับเงื่อนไขอื่น หวังว่าสิ่งนี้จะช่วยให้คุณเข้าใจตรรกะ

name = ("Data" != null) ? "Data" : "N/A";

console.log(name);



2

ง่ายและชัดเจน:

String manType = hasMoney() ? "rich" : "poor";

รุ่นยาว:

      String manType;
    if (hasMoney()) {
        manType = "rich";
    } else {
        manType = "poor";
    }

หรือวิธีที่ฉันใช้เพื่อให้ชัดเจนสำหรับตัวอ่านรหัสอื่น ๆ :

 String manType = "poor";
    if (hasMoney())
        manType = "rich";

0

คุณสามารถใช้โอเปอเรเตอร์ในจาวาได้

ไวยากรณ์:

Condition ? Block 1 : Block 2

ดังนั้นในรหัสของคุณคุณสามารถทำสิ่งนี้ได้

name = ((city.getName() == null) ? "N/A" : city.getName());

สำหรับข้อมูลเพิ่มเติมคุณสามารถดูนี้ทรัพยากร


4
นี่เป็นคำถามอายุ 6 ปีและได้รับคำตอบแล้ว คำตอบของคุณไม่ได้ให้อะไรใหม่ -1
Makky

-3
name = city.getName()!=null?city.getName():"N/A"

4
แทนที่จะเพียงแค่โพสต์โค้ดคุณจะช่วย OP มากขึ้นโดยอธิบายเทคนิค มันทำงานยังไงทำไมมันถึงทำงาน
Zabuzard

1
การวางช่องว่างรอบตัวดำเนินการของคุณทำให้ง่ายต่อการอ่านและบำรุงรักษา
geowar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.