※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());
- Commons Langを使う
String asters = StringUtils.repeat("*", 10);
System.out.println(asters);
- 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!"));
});