Java基礎知識復習(14)--集合の集約操作

44940 ワード

Streamとパイプの概念
集約操作を理解するには、まずStreamとパイプの概念を確立しなければならない.StreamとCollectionの構造化のデータは異なり、Streamは一連の要素であり、生産ラインの缶詰のように、一連の列が出ている.パイプとは、一連の集約操作を指します.
パイプはまた3つの部分に分かれています
パイプソース:ソースはリストです
中間操作:各中間操作は、Streamを返します.たとえば.filter()はまたStreamを返し、中間操作は「怠け者」操作であり、実際に遍歴することはありません.
パイプソース
Collectionをパイプソースに切り替えるのは簡単でstream()を呼び出せばいいです.
中間操作は主に2種類に分けられる
1)要素のフィルタ処理:
  • filterマッチング
  • distinct除去繰返し(equals判定による)distinct除去繰返し(equals判定による)
  • sorted自然ソートsorted自然ソート
  • sorted(Comparator)指定ソートsorted(Comparator)指定ソート
  • limit予約limit予約
  • skip無視skip無視
  • 2)別の形式のストリームに変換
  • mapToDouble変換doubleのストリーム
  • mapが任意のタイプのストリームmapに変換する任意のタイプのストリームに変換する.

  • 操作の終了
    終了操作:この操作が実行されると、ストリームは「光」を使用し、操作できなくなります.これは必ずストリームの最後の操作です.終了操作はStreamを返さないが、int、float、String、Collection、またはforEachのように何も返さず、終了操作は真の遍歴行為を行い、遍歴するときに中間操作を行うという判断によく見られる終了操作は以下の通りである.
  • forEach()各要素
  • を巡る
  • toArray()を配列
  • に変換
  • min(Comparator)最小の要素
  • をとる
  • max(Comparator)最大の要素
  • をとる
  • count()総数
  • findFirst()最初の要素
  • 注意:このStreamとI/O章のInputStream、OutputStreamは異なる概念です.
    テストコード(中間操作)
    Hero.java
    package stack;
    
    public class Hero {
    	private String name;
    	private float hp;
    	
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public Hero(String name, float hp) {
    		super();
    		this.name = name;
    		this.hp = hp;
    	}
    
    	public float getHp() {
    		return hp;
    	}
    
    	public void setHp(float hp) {
    		this.hp = hp;
    	}
    
    	@Override
    	public String toString() {
    		return "[name=" + name + ", hp=" + hp + "]";
    	}
    	
    	
    }
    
    
    package review5;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    
    import stack.Hero;
    
    public class TestAggregate {
    	public static void main(String[] args) {
    		  Random r = new Random();
    	        List<Hero> heros = new ArrayList<Hero>();
    	        for (int i = 0; i < 5; i++) {
    	            heros.add(new Hero("hero " + i, r.nextInt(1000)));
    	        }
    	        //        
    	        heros.add(heros.get(0));
    	        System.out.println("          (        ):");
    	        System.out.println(heros);
    	        System.out.println("    hp>100   ");
    	          
    	        heros
    	            .stream()
    	            .filter(h->h.getHp()>100)
    	            .forEach(h->System.out.print(h));
    	        System.out.println();
    	        System.out.println("       ,      equals");
    	        heros
    	            .stream()
    	            .distinct()
    	            .forEach(h->System.out.print(h));
    	        System.out.println();
    	        System.out.println("      ");
    	        heros
    	            .stream()
    	            .sorted((h1,h2)->h1.getHp()>=h2.getHp()?1:-1)
    	            .forEach(h->System.out.print(h));
    	       System.out.println();   
    	        System.out.println("  3 ");
    	        heros
    	            .stream()
    	            .limit(3)
    	            .forEach(h->System.out.print(h));
    	         System.out.println();
    	        System.out.println("   3 ");
    	        heros
    	            .stream()
    	            .skip(3)
    	            .forEach(h->System.out.print(h));
    	        System.out.println();
    	        System.out.println("   double Stream");
    	        heros
    	            .stream()
    	            .mapToDouble(Hero::getHp)
    	            .forEach(h->System.out.println(h));
    	        System.out.println();
    	        System.out.println("       Stream");
    	        heros
    	            .stream()
    	            .map((h)-> h.getName() + " - " + h.getHp())
    	            .forEach(h->System.out.println(h));
    	}
    }
    
    

    テストコード(終了操作)
    package review5;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    
    import stack.Hero;
    
    public class TestAggregate {
    	public static void main(String[] args) {
    		 Random r = new Random();
    	        List<Hero> heros = new ArrayList<Hero>();
    	        for (int i = 0; i < 5; i++) {
    	            heros.add(new Hero("hero " + i, r.nextInt(1000)));
    	        }
    	        System.out.println("          ");
    	        heros
    	            .stream()
    	            .forEach(h->System.out.print(h));
    	        System.out.println();
    	        System.out.println("      ");
    	        Object[] hs= heros
    	            .stream()
    	            .toArray();
    	        System.out.println(Arrays.toString(hs));
    	        System.out.print("           :");
    	        Hero minHpHero =
    	        heros
    	            .stream()
    	            .min((h1,h2)->(int)h1.getHp() - (int)h2.getHp())
    	            .get();
    	        System.out.println(minHpHero);
    	        System.out.print("           :");
    	 
    	        Hero maxHpHero =
    	                heros
    	                .stream()
    	                .max((h1,h2)->(int)h1.getHp()-(int)h2.getHp())
    	                .get();
    	        System.out.println(maxHpHero);     
    	         
    	        System.out.print("       :");
    	        long count = heros
    	                .stream()
    	                .count();
    	        System.out.println(count);
    	 
    	        System.out.print("     :");
    	        Hero firstHero =
    	                heros
    	                .stream()
    	                .findFirst()
    	                .get();
    	         
    	        System.out.println(firstHero);
    	}
    }
    
    

    練習-集約操作
    まずHeroオブジェクトを10個用意し,hpは乱数である.それぞれ従来方式と集約操作方式でhp第3高のヒーロー名を印刷する
    package review5;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    import java.util.stream.Stream;
    
    import stack.Hero;
    
    public class TestAggregate {
    	public static void main(String[] args) {
    		 Random r = new Random();
    	        List<Hero> heros = new ArrayList<Hero>();
    	        for (int i = 0; i < 10; i++) {
    	            heros.add(new Hero("hero " + i, r.nextInt(1000)));
    	        }
    	        //       , hp            
    	        heros.stream()
    	        .sorted((h1,h2) -> h1.getHp() > h2.getHp() ? -1 :h1.getHp() < h2.getHp() ? 1 : 0 )
    	        	.forEach(h -> System.out.println(h));
    	        
    	       Stream<Hero> hero = heros.stream()
    	    		 //  
    	       		.sorted((h1,h2) -> h1.getHp() > h2.getHp() ? -1 :h1.getHp() < h2.getHp() ? 1 : 0 )
    	       		//     
    	       		.skip(2);
    
    	       System.out.println("       , hp            :"+hero.findFirst());	
    	       
    	       //       , hp            
    	       Collections.sort(heros,(h1,h2) -> h1.getHp() > h2.getHp() ? -1 :h1.getHp() < h2.getHp() ? 1 : 0 );
    	       System.out.println("       , hp            :"+heros.get(2));
    	       
    	}
    }