Edited at

Java8コードサンプル(for文禁止)

More than 1 year has passed since last update.

※Java8練習用のコードのため、実用的であるかはあまり考慮していない


for文を使わない書き方

Java8から実装されたAPIを使って、for文を使わずにコードを書いた場合のサンプル。

Java8以前の書き方と比較するため、「Java7」にfor文を使ったコードを記載する。


指定回数の繰り返し

10回、一定の文字列を出力する。


  • Java7

for (int i=0; i < 10; i++) {

System.out.println("Java!");
}


  • Java8

IntStream.range(0, 10).forEach(i -> System.out.println("Java!"));

他の言語の場合


  • Scala

(0 until 10).foreach(i => println("Scala!"))

// or
(1 to 10).foreach(i => println("Scala!"))


  • Groovy

(0 ..< 10).each { println("Groovy!") }

// or
(1 .. 10).each { println("Groovy!") }


同じ文字の繰り返し


  • Java7

StringBuilder sb = new StringBuilder();

for (int i=0; i < 10; i++) {
sb.append("*");
}
System.out.println(sb.toString());

String asters = StringUtils.repeat("*", 10);

System.out.println(asters);


StringUtils#repeat



  • Java8

String asters = IntStream.range(0, 10)

.mapToObj(i -> "*")
.collect(Collectors.joining());
System.out.println(asters);


この書き方は書けるというサンプルで、実際はやらない方がいいと思う



文字列長が一番多い文字列を返却


  • Java7

public String getMaxString(List<String> list) {

String result = "";
for (String str : list) {
if (str != null && str.length() >= result.length()) {
result = str;
}
}
return result;
}


  • Java8

public String getMaxString(List<String> list) {

return list
.stream()
.filter(str -> str != null)
.reduce((str1, str2) -> str1.length() >= str2.length() ? str1 : str2)
.orElse("");
}


作った値の合計を返却


  • java7

int sum = 0;

for (int i=0; i < 10; i++) {
sum += i * 2;
}


  • java8

int sum = IntStream.range(0, 10).map(i -> i * 2).sum();


インナークラスの実装

関数型インターフェイスとなるインターフェイスを持つクラスを、インナークラスで定義した場合。


Thread#run()の実装


  • Java7

Thread t = new Thread() {

@Override
public void run() {
for (int i=0; i < 10000; i++) {
System.out.print("Nice!");
}
}
};


  • Java8

Thread t = new Thread(() -> {

IntStream.range(0, 10000).forEach(i -> System.out.print("Nice!"));
});


  • Java8(ThreadFactoryを使用した場合)

ThreadFactory factory = Executors.defaultThreadFactory();

Thread t = factory.newThread(() -> {
IntStream.range(0, 10000).forEach(i -> System.out.print("Nice!"));
});