こんにちは。いつもブログをご覧いただきありがとうございます。
Java8から導入されたラムダ式・StreamAPIについて、以下3つの内容を解説します。
- デフォルトメソッド
- 関数型インターフェース
- Stream API
動作環境は下記の通りです。
OS | Windows 10 Home |
Java | Open JDK 8 |
IDE | Visual Studio Code |
デフォルトメソッド
デフォルト メソッド (defalut method) を活用して、インターフェースにメソッドを実装してみましょう!
今回使用するクラス図になります。

これまでのインターフェース
これまでのインターフェースでは、定数や処理内容を持たないメソッドしか定義することができませんでした。
そのため、インターフェースを実装したクラス内で必ずメソッドの処理内容を書く必要がありました。
例えば、こんな感じです ↓
Calculationというインターフェースにexecuteというメソッドを定義しました。
もちろん、executeメソッドに処理内容を書くことは出来ません。
public interface Calculation {
public double execute(int arg);
}
Calculationインターフェースを実装したCalcクラスでexecuteメソッドの処理内容を書いています。
class Calc implements Calculation {
@Override
public double execute(int arg) {
return arg * 1.10;
}
}
以上が、これまでのインターフェースの基本的な実装方法になります。
これからのインターフェース
Java8以降から、インターフェースでデフォルトメソッドを使用することができます。
先ほどのCalculationインターフェースにmessageメソッドを追加しました。
default が付いているのがわかりますね。これが、デフォルトメソッドになります。
そして、これまでとは異なり、メソッドに処理内容を書くことが出来ます。
public interface Calculation {
// これまでのメソッド
public double execute(int arg);
// Java8から可能(デフォルト メソッド)
public default String message() {
return "現在の消費税は10%です";
}
}
Calculationインターフェースを実装したCalcクラスには影響はしません。
class Calc implements Calculation {
@Override
public double execute(int arg) {
return arg * 1.10;
}
}
Appクラスを作成し、Calcクラスを生成してみます。
public class App {
public static void main(String[] args) {
Calc calc = new Calc();
System.out.println( calc.execute(100) );
System.out.println( calc.message() );
}
}
■実行結果
110.00000000000001
現在の消費税は10%です

Java8からインターフェースにデフォルトメソッドが追加され、処理内容を書くことができるようになりました!
関数型インターフェース
関数型インターフェースとは、抽象メソッドを1つだけ持つインターフェースです。
あらかじめ標準APIとして存在する関数型インターフェースについて紹介します。
各インターフェースのメソッド一覧です。
関数型インターフェース | メソッド名 | 戻り値 | 引数 | 用途 |
---|---|---|---|---|
Function< T, R > | R apply( T ) | ○ | ○ | 引数を1つだけ受け取り、戻り値を返します。 |
Consumer< T > | void accept( T ) | × | ○ | 引数を1つだけ受け取り、戻り値は返さない。 |
Supplier< T > | T get( ) | ○ | × | 引数を受け取らず、戻り値を返します。 |
Predicate< T > | boolean test( T ) | ○ | ○ | 引数を1つだけ受け取り、trueかfalseを返します。 |
順番に見ていきましょう!
Function
Function<引数のデータ型, 戻り値のデータ型> を使用します。
引数や戻り値のデータ型に基本型(int, doubleなど)は使用できませんので、必ずクラス型(Integer, Double, Stringなど)を定義する必要があります。
import java.util.function.Function;
public class App {
public static void main(String[] args) {
Function< Integer, Integer > calc = ( num ) -> ( num*10 );
System.out.println( calc.apply( 5 ) );
}
}
与えられた引数の値を10倍にするサンプルコードになります。引数に5を与え、10倍する計算処理を行い、結果を表示するサンプルです。Functionインターフェースはapplyメソッドが使用できます。
Consumer
戻り値を必要としない場合、Consumerを使用できます。
使用できるメソッドはacceptです。
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> lambda = name -> {
System.out.println("Welcome to " + name);
};
lambda.accept( "Java" );
}
}
Supplier
引数を必要としない場合、Supplierを使用できます。
使用できるメソッドはgetです。
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Supplier<String> lambda = () -> {
return "Java Programming!";
};
System.out.println( lambda.get() );
}
}
Predicate
引数を必要とし、trueかfalseのboolean型の戻り値の場合、Predicateを使用できます。
使用できるメソッドはtestです。
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
Predicate<String> lambda = msg -> {
return "Java8".equals( msg );
};
System.out.println( lambda.test("Java7" ) );
}
}
Stream API
Java8から、データの集まりを簡潔に処理(検索・変換・分析)することができるようになりました。
「java.util.stream.Stream」が追加されています。
以下6つのメソッドを紹介します。
- sorted
- count
- sum
- average
sortedメソッド
データを並べ替えることができます。
import java.util.List;
public class App {
public static void main(String[] args) {
Record record = new Record();
// メソッド sorted
List<Record> recordList = record.setRecordList();
recordList.stream()
.sorted( (c1, c2) -> c1.getName().compareTo(c2.getName()) )
.forEach(c-> System.out.println(c.getName()));
}
}
countメソッド
要素数を取得することができます。
import java.util.List;
public class App {
public static void main(String[] args) {
Record record = new Record();
List<Record> recordList = record.setRecordList();
// メソッド count
long count = recordList.stream()
.filter(c -> c.getScore_english() > 80)
.count();
System.out.println(count);
}
}
sumメソッド
要素の数値データから合計を算出することできます。
import java.util.List;
public class App {
public static void main(String[] args) {
Record record = new Record();
List<Record> recordList = record.setRecordList();
// メソッド sum
long total_score = recordList.stream()
.mapToInt( c -> c.getScore_english()).sum();
System.out.println( total_score );
}
}
averageメソッド
要素の数値データから平均を算出することできます。
import java.util.List;
import java.util.OptionalDouble;
public class App {
public static void main(String[] args) {
Record record = new Record();
List<Record> recordList = record.setRecordList();
// メソッド average
OptionalDouble ave = recordList.stream()
.mapToDouble( c -> c.getScore_english()).average();
System.out.println(ave);
}
}
本記事のまとめ
今回は、Java8から導入されたラムダ式・StreamAPI について解説しました。
最後まで読んでいただき、ありがとうございます (*^-^*)
本記事の内容をまとめると以下の通りです。
■デフォルトメソッドの追加
Java8からインターフェースにデフォルトメソッドが定義でき、処理内容を記述することが可能!
■関数型インターフェースの実装方法
関数型インターフェース | メソッド名 | 戻り値 | 引数 | 用途 |
---|---|---|---|---|
Function< T, R > | R apply( T ) | ○ | ○ | 引数を1つだけ受け取り、戻り値を返します。 |
Consumer< T > | void accept( T ) | × | ○ | 引数を1つだけ受け取り、戻り値は返さない。 |
Supplier< T > | T get( ) | ○ | × | 引数を受け取らず、戻り値を返します。 |
Predicate< T > | boolean test( T ) | ○ | ○ | 引数を1つだけ受け取り、trueかfalseを返します。 |
■Stream APIの実装方法
- sorted
- count
- sum
- average
おすすめ記事
「Javaプログラミングをもう一度本格的に勉強したいっ!」という方へ
逆に、「Javaプログラミング以外を本格的に勉強したいっ!」という方へ