能否不使用if/else、三元表达式、switch实现取余类型判断逻辑?
无分支语句实现数字类型判断逻辑
现有一段通过取余运算结合三元表达式、switch语句判断数字类型的代码:
int type1 = (number % 3 == 0 && number % 5 != 0) ? 1 : 0; int type2 = (number % 3 != 0 && number % 5 == 0) ? 2 : 0; int type3 = (number % 3 == 0 && number % 5 == 0) ? 3 : 0; int result = type1 + type2 + type3; switch (result) { case 1: return "Type 1"; case 2: return "Type 2"; case 3: return "Type 3"; default: return String.valueOf(number); }
请问能否不使用if、else、三元表达式、switch语句来实现该逻辑?
可行实现方案
完全可以,我们可以利用余数周期性+数组映射的方式彻底规避分支语句,核心思路如下:
由于判断条件仅依赖数字对3和5的整除性,而3和5的最小公倍数是15,所有整数对15取余的结果只会落在0-14这15种固定情况中。我们可以提前为每种余数对应的结果构建映射数组,再通过取余后的索引直接获取结果,对于需要返回原数字的情况,用Optional完成默认值替换,全程无任何分支语句。
Java代码实现
import java.util.Optional; public String classifyNumber(int number) { // 索引对应 number%15 的结果,提前定义每种情况的返回值 // null 标记需要返回原数字的情况 String[] resultMappings = { "Type 3", // 0: 同时被3、5整除 null, null, "Type 1", null, // 1、2、4:无匹配类型 "Type 2", "Type 1", null, null, // 5: 被5整除;6: 被3整除;7、8:无匹配 "Type 1", "Type 2", null, "Type 1", //9:被3整除;10:被5整除;11:无匹配;12:被3整除 null, null //13、14:无匹配 }; // 处理负数取余,确保索引始终在0-14范围内 int index = (number % 15 + 15) % 15; // 用Optional自动替换null为原数字的字符串 return Optional.ofNullable(resultMappings[index]) .orElseGet(() -> String.valueOf(number)); }
方案说明
- 余数周期处理:通过
(number %15 +15) %15解决Java中负数取余结果为负的问题,确保索引始终落在0-14的有效范围内。 - 数组映射:提前将每种余数对应的结果存入数组,直接通过索引访问,无需任何分支判断。
- 默认值替换:用
Optional.ofNullable(...).orElseGet(...)自动将标记为null的项替换为原数字的字符串,代码中无显式分支语句。
内容的提问来源于stack exchange,提问作者Shariq Shaikh
相关产品推荐
相关产品推荐

