Java8から追加になった【ラムダ式・StreamAPI】を徹底解説!

スポンサーリンク

こんにちは。いつもブログをご覧いただきありがとうございます。

Java8から導入されたラムダ式・StreamAPIについて、以下3つの内容を解説します。

  1. デフォルトメソッド
  2. 関数型インターフェース
  3. Stream API

動作環境は下記の通りです。

OSWindows 10 Home
JavaOpen JDK 8
IDEVisual 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
  • Consumer
  • Supplier
  • Predicate

各インターフェースのメソッド一覧です。

関数型インターフェースメソッド名戻り値引数用途
Function< T, R >R apply( T )引数を1つだけ受け取り、戻り値を返します。
Consumer< T >void accept( T )×引数を1つだけ受け取り、戻り値は返さない。
Supplier< T >T get( )×引数を受け取らず、戻り値を返します。
Predicate< T >boolean test( T )引数を1つだけ受け取り、truefalseを返します。

順番に見ていきましょう!

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つのメソッドを紹介します。

  1. sorted
  2. count
  3. sum
  4. 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つだけ受け取り、truefalseを返します。

Stream APIの実装方法

  1. sorted
  2. count
  3. sum
  4. average

おすすめ記事

Javaプログラミングをもう一度本格的に勉強したいっ!」という方へ

逆に、「Javaプログラミング以外を本格的に勉強したいっ!」という方へ

Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
Javaスキルで悩んでいる方必見!本気で学習できる環境を探してみよう!
詳細はこちら
タイトルとURLをコピーしました