[Java]Streams(ストリーム)


Streamとは?


  • データオブジェクトに関係なく、同じ演算を実行し、一致した演算を用いてデータ処理を簡単に分かりやすくします.

  • 配列,集合に対して演算を実行し,資料処理の抽象化を体現した.

  • 作成して使用したストリームは再使用できません!!演算を実行するストリームを作成すると、ストリームは消費され、他の演算を実行するには、新しいストリームを再作成する必要があります.

  • データストリームを作成すると、データストリームで使用される独立したメモリ領域が作成されるため、演算を実行しても既存のデータは変更されません.

  • ストリームの演算は中間演算と最終演算に分けられ、ストリームの中間演算は複数の演算を適用することができるが、最終演算は最後の演算にのみ適用される.

  • 中間演算は最終演算を呼び出す必要があり、中間演算の結果は演算中に未知である.

  • 中間演算は遅延演算とも呼ばれる.
  • ちゅうかんえんざん


  • 最終演算の呼び出し時に中間演算を実行します.

  • filter()、map()、sorded()など.

  • filter():条件に合致する要素を抽出する演算

  • map():変換要素の演算
  • さいしゅうえんざん


  • ストリーム管理のデータは次々と消費され、演算が実行される.

  • forEach()、count()、sum()など.

  • forEach():要素を1つずつ抽出する演算

  • count():要素の数を返します.

  • sum():要素の和を返します.
  • 👨🏻‍💻 Example Code1

    import java.util.Arrays;
    import java.util.stream.IntStream;
    
    public class InArrayStreamTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] arr = {1,2,3,4,5};
    		
    		for (int num: arr) {
    			System.out.println(num);
    		}
    		
    		System.out.println();
    		
    		Arrays.stream(arr).forEach(n-> System.out.println(n));
    		// Stream과 람다식을 사용하여 위의 코드와 같은 결과를 낼 수 있다.
    		
    		IntStream is = Arrays.stream(arr);
    		// IntStream 인스턴스를 생성하여 is.~ 을 통해 연산자들을 사용할 수도 있다.
    		is.forEach(n-> System.out.println(n));
    		
    		// Stream은 한번 사용하면 더이상 사용을 못하고 새로 만들어줘야한다.
    		// is Stream은 위에서 사용을 했기에 다시 사용하려고 하면 오류가 발생한다.
    		// is.forEach(n-> System.out.println(n));
    	}
    
    }

    👨🏻‍💻 Example Code2

    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Stream;
    
    public class ArrayListStreamTest {
    	public static void main(String[] args) {
    		List<String> sList = new ArrayList<>();
    		sList.add("Tomas");
    		sList.add("Edward");
    		sList.add("Jack");
    		
    		Stream<String> stream = sList.stream();
    		stream.forEach(s-> System.out.println(s));
    
    		System.out.println();
    		
    		//14,15라인의 Stream은 한번 사용하여 재사용 불가, 아래에서는 새로 생성
    		sList.stream().sorted().forEach(s-> System.out.print(s + "\t"));
    		
    		System.out.println("\n");
    		sList.stream().map(s->s.length()).forEach(n-> System.out.print(n + "\t"));
    		// map은 요소를 변환하기 위해 사용
    		
    		System.out.println("\n");
    		sList.stream().filter(s->s.length() >= 5).forEach(n-> System.out.print(n + "\t"));
    		// filter는 조건문과 같은 것
    	}
    }
    

    reduce()演算


    これは、
  • Streamが提供する基本演算に加えて、必要な演算を直接定義する方法です.(プログラマが直接実施する非定義演算を適用する)
  • 	T reduce(T identify, BinaryOperator<T> accumulator)
        T reduce(BinaryOperator<T> accumulator) // binaryOperator만 사용할 수도 있다.

  • 上記のコードでは、1番目のパラメータが初期値であり、2番目のパラメータが直接ramda式を実現しているか、ramda式であればBinaryOperatorインタフェースを実現しているクラスを使用してもよい.

  • 整数グループのreduce操作の例を求めます
    最初のパラメータ0は値の初期値であり、加算演算により、初期値0を配列内のすべての値に加算します.
  • 	Arrays.stream(arr).reduce(0, (a,b)->a+b)); 

    BinaryOperator


  • BinaryOperatorはランダ食品長の場合に使用します.

  • BinaryOperatorを使用するには、applyという方法を再定義する必要があります.
  • 👨🏻‍💻 Example Code

    import java.util.Arrays;
    import java.util.function.BinaryOperator;
    
    class CompareString implements BinaryOperator<String>{
    
    	@Override
    	public String apply(String s1, String s2) {
    		// TODO Auto-generated method stub
    		if (s1.getBytes().length >= s2.getBytes().length) return s1;
    		else return s2;
    	}
    	
    }
    
    public class ReduceTest {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String[] greetings = {"안녕하세요~~~", "hello", "Good morning", "반갑습니다^^"};
    		
    		// reduce function에서 람다식을 사용한 예시
    		System.out.println(Arrays.stream(greetings).reduce("",(s1, s2) ->
    				{if (s1.getBytes().length >= s2.getBytes().length) return s1;
    				else return s2; }
    				));
    		
    		
    		// BinaryOperator를 사용한 예시
    		String str = Arrays.stream(greetings).reduce(new CompareString()).get();
    		System.out.println(str);
    		
    	}	
    
    }

    Reference

  • Fast Campas-JavaとSpring Web開発のプライマリ・ハイパー・パケットのオンライン化を一度に完了します。