【Java 8新機能】Java 8 flatMap使用例


文書ディレクトリ
  • 1.Listで`Stream.flatMap`メソッド
  • を使用
  • 2.Listリストで`Stream.flatMap`メソッド
  • を使用
  • 3.Arrayで‘Stream.flatMap’メソッド
  • を使用
  • 4.オブジェクト配列に‘Stream.flatMap’メソッド
  • を使用
  • 5.`Files.lines()`に`Stream.flatMap`メソッド
  • を使用
  • 6.`Optional flatMap`
  • コードダウンロード
  • 参考文献
  • このページでは、Java8 FlatMapの例を示します.ここではStream.flatMapおよびOptional.flatMap()の方法について論じる.Stream.flatMap()は、ソースストリームの各要素をマッピング関数で置換した要素を含み、結果をフラット化するストリームを返します.マッピング関数はストリームを生成し、マッピングが適用された後に各マッピングストリームを閉じます.オブジェクトストリームに統計関数を適用することは有用であり、1行で符号化することができる.Optional.flatMap()値が存在する場合、オプションの方位マッピング関数が適用されます.以下に、異なるシーンにおけるflatMapの例を示す.
    Javaドキュメントでは、Stream.flatMap()メソッドの定義は次のとおりです.
    <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
    
    Optional.flatMap()の定義は次のとおりです.
    public <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
    

    元のデータ型の場合、javaは、flatMapToInt()flatMapToLong()、およびflatMapToDouble()のインターフェースを提供する.
    1.リストにおけるStream.flatMapの方法の使用
    ここには作家のリストがあります.どの作家にも本のリストがある.Stream.flatMap()を使用して、私たちはすべての作家からすべての本を手に入れます.そして私たちは一番高い本を見つけます.1.作家流の対象.
    {
         
       {
         "Mohan",
        {
         
          {
         10,"AAA"}, {
         20,"BBB"}
        }
       },
       {
         "Sohan",
        {
         
          {
         30,"XXX"}, {
         15,"ZZZ"}
        }
       }
    }
    

    2.flatMap(writer -> writer.getBooks().stream())の方法を使用した後、リストのフロー対象を得る.
    {
               
       {
         10,"AAA"}, 
       {
         20,"BBB"},
       {
         30,"XXX"}, 
       {
         15,"ZZZ"}
    }
    

    ここでの結果はflatMap()メソッドによって展開される.
    3.max(new BookComparator())の方法を使って、一番高い本を手に入れます.
    {
         30,"XXX"}
    

    コードを見てみましょう
    FlatmapWithList.java
    package com.concretepage;
    import java.util.Arrays;
    import java.util.List;
    public class FlatmapWithList {
         
        public static void main(String[] args) {
         
        	List<Book> books = Arrays.asList(new Book(10, "AAA"), new Book(20, "BBB"));
        	Writer w1 = new Writer("Mohan", books);
        	books = Arrays.asList(new Book(30, "XXX"), new Book(15, "ZZZ"));
        	Writer w2 = new Writer("Sohan", books);    	
        	List<Writer> writers = Arrays.asList(w1, w2);
        	Book book = writers.stream().flatMap(writer -> writer.getBooks().stream())
        			.max(new BookComparator()).get();
        	System.out.println("Name:"+book.getName()+", Price:"+ book.getPrice() );
        }
    }  
    

    Writer.java
    package com.concretepage;
    import java.util.List;
    public class Writer {
         
    	private String name;
    	private List<Book> books;
    	public Writer(String name, List<Book> books) {
         
    		this.name = name;
    		this.books = books;
    	}
    	public String getName() {
         
    		return name;
    	}
    	public void setName(String name) {
         
    		this.name = name;
    	}
    	public List<Book> getBooks() {
         
    		return books;
    	}
    	public void setBooks(List<Book> books) {
         
    		this.books = books;
    	}
    } 
    

    Book.java
    package com.concretepage;
    public class Book {
         
    	private int price;
    	private String name;
    	public Book(int price, String name) {
         
    		this.price = price;
    		this.name = name;
    	}
    	public int getPrice() {
         
    		return price;
    	}
    	public void setPrice(int price) {
         
    		this.price = price;
    	}
    	public String getName() {
         
    		return name;
    	}
    	public void setName(String name) {
         
    		this.name = name;
    	}
    } 
    

    BookComparator.java
    package com.concretepage;
    import java.util.Comparator;
    public class BookComparator implements Comparator<Book> {
         
    	@Override
    	public int compare(Book b1, Book b2) {
         
    		if (b1.getPrice() > b2.getPrice()) {
         
    			return 1;
    		} else if (b1.getPrice() == b2.getPrice()) {
         
    			return 0;
    		} else {
         
    			return -1;
    		}
    	}
    } 
    

    しゅつりょく
    Name:XXX, Price:30
    

    2.ListリストにおけるStream.flatMapメソッドの使用
    ここでは、リスト付きflatMapメソッドを使用する.各リストに図書のオブジェクトが含まれている2つのリストを作成しています.最後に、この2つのリストを3番目のリストに追加します.私たちはこの本を最低価格で買います.
    FlatmapWithListOfList.java
    package com.concretepage;
    import java.util.Arrays;
    import java.util.List;
    public class FlatmapWithListOfList {
         
        public static void main(String[] args) {
         
        	List<Book> list1 = Arrays.asList(new Book(10, "AAA"), new Book(20, "BBB"));
        	List<Book> list2 = Arrays.asList(new Book(30, "XXX"), new Book(15, "ZZZ"));
        	List<List<Book>> finalList = Arrays.asList(list1, list2);
        	Book book = finalList.stream().flatMap(list -> list.stream()).min(new BookComparator()).get();
        	System.out.println("Name:"+book.getName()+", Price:"+ book.getPrice() );
        }
    } 
    

    しゅつりょく
    Name:AAA, Price:10
    

    3.ArrayにおけるStream.flatMapの方法の使用
    ここでは、配列付きflatMapを使用します.整数データで2 D配列を作成しています.最後に偶数を見つけます.1.配列サンプル
    {
         {
         1,2},{
         3,4},{
         5,6}}
    

    2.flatMap(row -> Arrays.stream(row))方法使用後
    {
         1,2,3,4,5,6}
    

    3.filter(num -> num%2 == 0)方法使用後
    {
         2,4,6}
    

    具体的なコード例を見てみましょう
    FlatMapWithArray.java
    package com.concretepage;
    import java.util.Arrays;
    public class FlatMapWithArray {
         
    	public static void main(String[] args) {
         
    		Integer[][] data = {
         {
         1,2},{
         3,4},{
         5,6}};
    		Arrays.stream(data).flatMap(row -> Arrays.stream(row)).filter(num -> num%2 == 0).
    		forEach(System.out::println);
    	}
    } 
    

    しゅつりょく
    2
    4
    6 
    

    4.オブジェクト配列におけるStream.flatMapメソッドの使用
    ここでは、オブジェクト配列を有するflatMapの例を示す.Writerの2 D配列を作成します.このクラスには、書籍のリストが含まれます.私たちは最高価格の本を見つけます.
    FlatMapWithArrayOfObject.java
    package com.concretepage;
    import java.util.Arrays;
    import java.util.List;
    public class FlatMapWithArrayOfObject {
         
        public static void main(String[] args) {
         
        	List<Book> books = Arrays.asList(new Book(10, "AAA"), new Book(20, "BBB"));
        	Writer w1 = new Writer("Mohan", books);
        	books = Arrays.asList(new Book(30, "CCC"), new Book(15, "DDD"));
        	Writer w2 = new Writer("Sohan", books);    	
        	books = Arrays.asList(new Book(45, "EEE"), new Book(25, "FFF"));
        	Writer w3 = new Writer("Vikas", books);
        	books = Arrays.asList(new Book(5, "GGG"), new Book(15, "HHH"));
        	Writer w4 = new Writer("Ramesh", books);
            Writer[][] writerArray = {
         {
         w1,w2},{
         w3,w4}};
            
            Book book = Arrays.stream(writerArray).flatMap(row -> Arrays.stream(row)).
                flatMap(writer -> writer.getBooks().stream()).max(new BookComparator()).get();
            
            System.out.println("Name:"+book.getName()+", Price:"+ book.getPrice() );
        }
    } 
    

    しゅつりょく
    Name:EEE, Price:45
    

    5.Files.lines()におけるStream.flatMapの使用方法Files.lines()がJava 8に導入されました.ファイルのすべてのローをストリームとして読み込みます.私たちの例では、いくつかの行を含むファイルがあります.すべての単語をリストに保存して印刷します.
    info.txt
    My name is Mohan
    Country is India  
    

    FlatMapWithFile.java
    package com.concretepage;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Stream;
    public class FlatMapWithFile {
         
    	public static void main(String[] args) {
         
    	    Stream<String> lines = null;
    	    try {
         
    		lines = Files.lines(Paths.get("D:/cp/info.txt"), StandardCharsets.UTF_8);
    	    } catch (IOException e) {
         
    		e.printStackTrace();
    	    }
    	    Stream<String> stream = lines.flatMap(line -> Stream.of(line.split(" +")));
    	    List<String> words = new ArrayList<>();
    	    stream.forEach(w->words.add(w));
    	    words.forEach(w -> System.out.println(w));
    	}
    } 
    

    しゅつりょく
    My
    name
    is
    Mohan
    Country
    is
    India 
    

    6. Optional flatMap java8にはOptionalが導入されている.その動作は、空でない値を維持できるコンテナに似ています.NullPointerExceptionを処理します.flatMapは、値が存在する場合にのみ適用されます.例を探します.
    OptionalflatMap.java
    package com.concretepage;
    import java.util.Optional;
    public class OptionalflatMap {
         
        public static void main(String[] args) {
         
            Optional<PrimeMinister> primeMinister = Optional.of(new PrimeMinister("Narendra Modi", 65));
            Optional<Country> country = Optional.of(new Country(primeMinister));
            Optional<Person> person = Optional.of(new Person(country));
            String pmName= person.flatMap(Person::getCountry).flatMap(Country::getPrimeMinister)
                    .map(PrimeMinister::getName).orElse("None");
            System.out.println(pmName);
       }
    } 
    

    Country.java
    package com.concretepage;
    import java.util.Optional;
    public class Country {
         
    	Optional<PrimeMinister> primeMinister;
            public Country(){
         }
            public Country(Optional<PrimeMinister> primeMinister){
         
                    this.primeMinister = primeMinister;
            }
    	public Optional<PrimeMinister> getPrimeMinister() {
         
    		return primeMinister;
    	}
    	public void setPrimeMinister(Optional<PrimeMinister> primeMinister) {
         
    		this.primeMinister = primeMinister;
    	}
    } 
    

    Person.java
    package com.concretepage;
    import java.util.Optional;
    public class Person {
         
    	Optional<Country> country;
            public Person(){
         }
            public Person(Optional<Country> country){
         
            this.country = country;
            }
    	public Optional<Country> getCountry() {
         
    		return country;
    	}
    	public void setCountry(Optional<Country> country) {
         
    		this.country = country;
    	}
    } 
    

    しゅつりょく
    Narendra Modi
    

    コードのダウンロード
    java-8-flatmap-example.zip
    参考文献
    【1】Java 8 flatMap Example