Integer code = getCode();
String codeMeaning = code == null ? null :
                    code == 1 ? "你好" :
                    code == 2 ? "你好好" :
                    code == 3 ? "你好好好";
请各大佬帮忙修改这段代码
code == null ? null 看起来有点怪怪的
看了大家的建议 收获颇丰
我比较喜欢简短一点的代码(在不影响可读性的情况下) 所以比较喜欢三元。。大家轻喷
因为业务原因 code=1d的情况下 codeMeaning不一定是”你好“,所以不能使用枚举类或者Map
目前我采用了9楼的写法 代码美观且解决了空指针的问题(楼上几位的代码也很好)
但这样写代码从4行增加到了9行,有没有更简洁且美观的写法。
大家轻喷哈,刚毕业。。啥都不懂
为了方便大家理解真正的需求,更新下简化版的实际代码:
//方法1
Integer unit = getUnit (type1);
String transferredUnit = unit == null ? null :
                    unit == 1 ? "kg" :
                    unit == 2 ? "g" :
                    unit == 3 ? "t";
//方法2
Integer unit = getUnit (type2);
String transferredUnit = unit == null ? null :
                    unit == -1 ? "kg" :
                    unit == 0 ? "g" :
                    unit == 1 ? "t";
//方法3
Integer unit = getUnit (type3);
String transferredUnit = unit == null ? null :
                    unit == 4 ? "kg" :
                    unit == 5 ? "g" :
                    unit == 6 ? "t";
这样的情况用枚举类是化简为烦了吧应该,因为要针对不同type创建多个枚举类
用Map或者直接switch应该是比较好的方法
Integer unit = getUnit (type) 这个方法是从一个远古软件生成的txt文档中提取 单位(数字格式)
不同的unit对应什么含义,需要查阅PDF文档来翻译,有很多不同情况
大家不要纠结为什么不统一unit与transferredUnit的对应关系哈,这个我无能为力...
|  |      1avk458      2019-12-31 11:25:38 +08:00 三元表达式还能这样玩儿? 按照这个`codeMeaning`的意思来用 switch 是不是更好? 包装类比较是不是应该用 equals ? | 
|  |      2pmispig      2019-12-31 11:27:02 +08:00  7 谁写的,先把他头锤爆 | 
|  |      3Lin0936      2019-12-31 11:28:53 +08:00 // TODO: Bullshit | 
|      4sandman511 OP @pmispig 实不相瞒。。我写的。。 | 
|  |      5manami      2019-12-31 11:36:53 +08:00 via Android Objects.equals(a, b) | 
|      6optional      2019-12-31 11:37:00 +08:00  1 // 第一种提前返回 ``` if (Objects.isNull(code)) { return null; } //switch or if ``` //第二种, ``` Optional.ofNullable(code).map(code->{ //switch or if }).orElse(null); ``` | 
|  |      7passerbytiny      2019-12-31 11:37:08 +08:00 一,Java 没有指针; 二,三元连接符嵌套使用是大忌; 三,if(some == null) { //bulabula when null }else{ //bulabula when not null},或者 if(some != null){bulabula},或者 some.ifPresent((value)->{/bulabula}), 是良好的编码习惯; 四,请善用默认值: Integer code = getCode(); String codeMeaning == null ;// 或者 "默认值" if(code != null){ switch (code.intValue()){ case 1 : codeMeaning = "你好"; break; // ...... } } | 
|      8sandman511 OP @avk458 我嫌 switch 写起来太麻烦了 这个逻辑比较简单 就三行 所以用了三元。。。请教一下三元不能这样用吗? 确实该用 equals,但是 code 可能为 null,equals 可能抛空指针。。所以不知道该咋办了 | 
|      9lff0305      2019-12-31 11:40:35 +08:00  2 ``` Optional<Integer> code = Optional.ofNullable(getCode()); String s = code.map(c -> { switch (c) { case 1: return "one"; case 2: return "two"; } return "other"; }).orElse(null); ``` | 
|  |      10lovelive1024      2019-12-31 11:44:24 +08:00 Map<Integer, String> map = new .... codeMeaning = map.get(code); | 
|  |      11U7Q5tLAex2FI0o0g      2019-12-31 11:44:46 +08:00 实不相瞒,三元这么嵌套不加括号的,除了傻逼笔试题外,工作中这样写的同事我会打死他(不是不能嵌套,你得加括号增加可读性) | 
|      12lihongjie0209      2019-12-31 11:54:00 +08:00 不加括号就是作死 | 
|  |      13w292614191      2019-12-31 11:55:22 +08:00 我感觉比楼上那些 if  else  switch 好看多了。 都是些秀无意义代码的。 你看看 7、9 楼, 硬是加长代码,毫无意义。 | 
|      14Jimmy2Angel      2019-12-31 11:58:35 +08:00 @passerbytiny 一,你真是个合格的杠精 | 
|  |      15ipwx      2019-12-31 12:01:09 +08:00 private static final String[] lookup = {null, "你好", "你好好", "你好好好"}; String codeMeaning = lookup[code != null? code.intValue() : 0]; https://ideone.com/7rXSyK | 
|      16matepi      2019-12-31 12:11:15 +08:00 via iPhone enum 特性都多少年了吧 | 
|  |      17banmuyutian      2019-12-31 12:11:53 +08:00  1 | 
|      18micean      2019-12-31 12:12:24 +08:00 挺清晰的,加啥括号?有换行和缩进还不够吗? | 
|  |      19lhx2008      2019-12-31 12:14:49 +08:00 via Android enum 吧,或者 map code 的话,null 就整个-1 呗,null 来 null 去的 | 
|  |      20wysnylc      2019-12-31 12:18:23 +08:00 optional+switch,或者用 java 13 还是 14 的新 switch | 
|  |      21kkkkkrua      2019-12-31 12:20:02 +08:00 via iPhone switch 不就好了么,用 default 处理 null | 
|  |      22sagaxu      2019-12-31 12:33:11 +08:00 via Android 应该用 int,避免 Integer,code 增加一项表示原来用 null 表示的情况。其实用 enum 不是更好吗? | 
|  |      23Sqpan2      2019-12-31 12:35:54 +08:00 via Android 做个枚举不香吗? | 
|      24sandman511 OP | 
|  |      25itechify PRO var table=new HashMap<Integer,String>(){ { put(k1,v1); put(k2,v2); // ... } }; table.get(xx) | 
|      26zzzHas      2019-12-31 13:04:07 +08:00 如果能提高阅读性, 代码长点就长点. | 
|      27looseChen      2019-12-31 13:26:14 +08:00 别特么的玩些花里胡哨的玩意 | 
|      28wesnow      2019-12-31 13:26:40 +08:00 via Android 代码更容易阅读比代码的长短重要得多,甚至可以说除非是非常极端的情况(比如有个地方确实对性能要求很高,这里就可能牺牲部分阅读性),否则都应该把代码更容易阅读更容易理解放在第一位。 | 
|      30wc951      2019-12-31 13:45:54 +08:00 via Android java8 的 optional 是最优雅的 | 
|      311et      2019-12-31 13:50:43 +08:00 int a = 1,b=2,c=3; int d = a+++b+++c; | 
|  |      32palmers      2019-12-31 13:59:27 +08:00 按照你回复的#24 我觉得可以使用枚举区分调用类别, 然后返回字符串抽象为方法  应该可以达到你的目的, 这么用确实不太好  除了秀也没有达到简洁的目的, 维护会越来越乱  临时用一下就没什么了 不知道你真是的需求是什么 就目前你暴露的意愿 我觉得 枚举+抽象可以很好的解决这个问题 也符合开闭原则 | 
|  |      34guyeu      2019-12-31 14:10:15 +08:00  1 String result = switch (Objects.requireNonNullElse(code, 0)) { case 0 -> null; case 1 -> "你好"; case 2 -> "你好好"; case 3 -> "你好好好"; default -> throw new UnsupportedOperationException(); }; | 
|      36hhhsuan      2019-12-31 14:21:15 +08:00 代码的首要作用是给人看,只是随便可以运行一下。 | 
|  |      37oaix      2019-12-31 14:24:57 +08:00 Optional 一般只建议用在方法的返回值。 | 
|  |      38ilumer      2019-12-31 14:29:36 +08:00 optional+enum 或者 optional+map 在 map 里面写 if else 的逻辑 | 
|      39sandman511 OP @palmers 我又在主贴 APPEND 了一下真正的需求 | 
|  |      41oaix      2019-12-31 14:47:05 +08:00 | 
|  |      42wutiantong      2019-12-31 14:50:57 +08:00 从 append 的代码来看,你应该把 Integer unit + String transferredUnit 这两样东西 wrap 成一个简单的 class,不妨就还叫 unit 好了,数字和字符串作为 unit 这个 class 的两个成员属性。 你的 getUnit(type) 应该直接返回这个 unit class。 | 
|  |      43palmers      2019-12-31 15:25:29 +08:00  1 public enum UnitOfWeight { KG("kg") { @Override public boolean match(int unit) { return false; } }, GRAM("g") { @Override public boolean match(int unit) { return false; } }, TON("t") { @Override public boolean match(int unit) { return false; } }, UNKNOWN("x-0"){ @Override public boolean match(int unit) { return false; } @Override public boolean unknown() { return true; } }; /** * e.g. kg, g, t */ @Getter private String note; static UnitOfWeight[] units = UnitOfWeight.values(); /** * kg's enums */ static int[] kgs = {1, -1, 4}; /** * gram's enums */ static int[] grams = {2, 0, 5}; /** * ton's enums */ static int[] tons = {3, 1, 6}; UnitOfWeight(String note) { this.note = note; } public static UnitOfWeight valueOf(Integer unit) { for (UnitOfWeight ofWeight : units) { if (unit == null) { return UNKNOWN; } if (ofWeight.match(unit)) { return ofWeight; } } return UNKNOWN; } /** * 获取对应枚举 * @param unit * @return */ public abstract boolean match(int unit); /** * 错误的值 * @return */ public boolean unknown() { return false; } public static void main(String[] args) { Integer unit = null; //getUnit (type2); UnitOfWeight ofWeight = UnitOfWeight.valueOf(unit); if (!ofWeight.unknown()) { String transferredUnit = ofWeight.getNote(); //... } } } 根据你 append 的代码用了一个枚举来做, 根据你的描述我想有几个点需要扩展, 1. 从 pdf 解析 type 值; 2. 有很多情况(可能因为历史原因很多地方使用了不同的值代表某一个单位); 所以我建议使用枚举, 原因是: 1. 我觉得后面随着业务需要或者其他原因重构, 可能慢慢的这些代表某一个单位的值会改变或者统一为一个,所以你需要修改 通过枚举可以统一在一处,便于修改; 2. 再者也方便返回的字符值变更 总之对于变更这个枚举类基本上可以应对 90%以上的情况; 3. match 方法可以做针对行的扩展和优化; | 
|      44boileryao      2019-12-31 16:20:59 +08:00 ```java // Put this map somewhere Map<Integer, String> codeMeaningInfo = new HashMap<>(); codeMeaningInfo.put(1, "你好"); codeMeaningInfo.put(2, "你好好"); codeMeaningInfo.put(3, "你好好好"); // Using this map String codeMeaning = codeMeaningInfo.get(code); ``` 一般情况下 Map 应该全局唯一,另外推荐 Kotlin 的 `when` 表达式。 | 
|  |      45loryyang      2019-12-31 16:22:23 +08:00 可以的话,尽量不要用 null,容易在各种传递运算中出现空指针异常。比如你这个 code 和 codeMeaning,code=-1,codeMeaning=“”表示异常。甚至可以用 Enum 来包装这些内容 如果硬是要用 null,我建议把 null 的处理和其他处理分开。尽量不要用三元表达式,这种东西比较反人类,写起来很爽,看起来一头包。 你这种情况可以写个函数 getCodeMeaning(Integer code) { if (code == null) { return null; } else if (code == 1) { ****** } 代码在可读可维护性面前,简洁性可以要求低一些 | 
|      46luozic      2019-12-31 16:45:26 +08:00 如果 java 有 pattern match 就可以玩优雅;但是 Java 没有,所以,理智一点,用表驱动去糊弄算了。 | 
|  |      47redford42      2019-12-31 17:24:29 +08:00 前几天看到一个 java8 的 optional 但其实我没看太明白... | 
|  |      48loryyang      2019-12-31 17:27:32 +08:00 @loryyang #45 另外还有一个避免魔法值,前面也好多人提了。对于这一点,我是觉得,你考虑一下是否有必要做。你这种 case,直接用一个 ImmutableMap 好了,这样可以变成: ImmutableMap.<Integer, String>builder().put(1, "").put(2, "").build() 然后 getCodeMeaning 函数里面变成 if (code == null) { return null; } if (code in immutableMap) { return immutableMap.get(code); } else { return ***; } 回头看一下,还是 null 太多了,null 这东西还是不要在正常流程中出现吧 | 
|  |      50godoway      2019-12-31 18:16:00 +08:00 via Android  1 | 
|      51houOne      2019-12-31 18:37:57 +08:00 你写的代码是给别人看的。  请你站在别人的角度思考一下,看到这个代码的心情 | 
|  |      52itechify PRO @nekoneko 深层嵌套获取值,一直判断非空很啰嗦,Optional 可以解决这个问题 | 
|  |      53winiex      2020-01-01 11:15:47 +08:00 永远不要嵌套多层三元表达式,三元表达式当且仅当只有一层逻辑判断时才可以使用。其它情况一律用 if else 老实地写。我甚至连一层逻辑判断都想强制只能用 if else。 | 
|      55micean      2020-01-01 16:49:23 +08:00 @brucefu  code == null ? null : code == 1 ? "你好" : code == 2 ? "你好好" : code == 3 ? "你好好好" : "其他"; 这不就是一个简易秒懂的 switch,楼上其他代码也做不到这么工整 | 
|      56micean      2020-01-01 16:55:50 +08:00 另外嵌套的三元还可以轻轻松松给 final 修饰的赋值 final String name = code == null ? "" : code == 1 ? "你好" : code == 2 ? "你好好" : code == 3 ? "你好好好" : "其他"; | 
|  |      57secondwtq      2020-01-01 18:31:04 +08:00 这不就是一个 Maybe Integer 解决的问题 ... 搞这么复杂 |