Javaの条件で(0 < foo && foo < 10)みたいに変数の数値の範囲を条件にする時
変数名を2回書くことになるんですけど、短くする方法はありますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
前提や背景次第ですけど、それが一番短いです。
投稿2021/09/21 10:58
総合スコア80875
0
javaのシンタックスでは
たとえば、fooが整数で0 <= foo < 2^n なら、(foo & ~15) == 0
や(foo & ~0xf) == 0)
などと書けますが、それ以外は思い浮かびません。一般的な条件で(0 < foo && foo < 10)
は最も可読性が良く効率的なバイトコードが生成されると思います。
java以外なら、言語を作るなら
たとえば(0 < foo < 10)
や(foo > 0 && < 10)
や(foo in (0 .. 10))
などが考えられます。これらのシンタックスはすでにありそうです。
参考
Java 17がリリースされたので遊んでみました。良くなることはありませんでした。
Java
1import java.util.List; 2import java.util.function.IntPredicate; 3import java.util.function.Supplier; 4import java.util.stream.Collectors; 5import java.util.stream.IntStream; 6 7public class q360646 { 8 9 public static void main(String[] args) { 10 11// test(x -> (x & ~15) == 0); 12// test(x -> (x & ~0xf) == 0); 13 14 test(x -> 0 < x && x < 10); 15 16 test(x -> ((x - 1) & ~7) == 0 || x == 9); 17 18 test(x -> (x - 10) * Math.signum(x) < 0); 19 20 test(x -> switch(x) { 21 case 1,2,3,4,5,6,7,8,9 -> true; 22 default -> false; 23 }); 24 25 test(((IntPredicate)(x -> 0 < x)).and(x -> x < 10)); 26 27 test(((Supplier<IntPredicate>) (() -> { 28 var list = List.of(1,2,3,4,5,6,7,8,9); 29 return x -> list.contains(x); 30 })).get()); 31 32 test(x -> IntStream.range(1, 10).anyMatch(i -> i == x)); 33 34 } 35 36 static final int LOWER_BOUND = -100; 37 static final int UPPER_BOUND = 100; 38 39 static void test(IntPredicate p) { 40 System.out.println( 41 IntStream.rangeClosed(LOWER_BOUND, UPPER_BOUND) 42 .filter(i -> p.test(i)) 43 .mapToObj(String::valueOf) 44 .collect(Collectors.joining(",")) 45 ); 46 } 47 48}
コードの補足
バグを見つけました。計算によって条件を求める場合はオーバーフローを考慮してください。
Java
1static final int LOWER_BOUND = Integer.MIN_VALUE; 2static final int UPPER_BOUND = Integer.MAX_VALUE; 3 4test(x -> (x - 10) * Math.signum(x) < 0);
結果は以下のようになります。
bash
1-2147483648,-2147483647,-2147483646,-2147483645,-2147483644,-2147483643,-2147483642,-2147483641,-2147483640,-2147483639,1,2,3,4,5,6,7,8,9
Java 17
コードはJava 17(16)で実行しましたが、Java 12以降で動作すると思います。
投稿2021/09/23 18:17
編集2021/09/24 22:54総合スコア1090
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。