[Ava]Streamと並列処理-2


7.Loopingメソッド(peek()、forEach()
peek()
中間処理loopingメソッドは、中間処理フェーズの要素全体をループして他の操作を実行するために使用されます.
最終的な処理方法が最後に実行されない場合は、この操作は実行されません.
forEach()
最終処理サイクル方法
最後のループラインで要素を1つずつ処理
foreachは最終処理方法であるため,後で別の最終処理方法を呼び出すことはできない.
import java.util.Arrays;

public class LoopingExample {
    public static void main(String[] args) {

        int[] intArr = {1, 2, 3,4,5,6};

        System.out.println("peek은 중간처리 메소드 - peek을 마지막에 호출한 경우, 동작하지 않음");
        Arrays.stream(intArr)
                .filter(a -> a%2 ==0)
                .peek(n-> System.out.println(n));

        // 최종 처리 메소드 sum()을 마지막에 호출하면 peek 동작함
        int total = Arrays.stream(intArr)
                .filter(a -> a%2 ==0)
                .peek(n-> System.out.println(n))
                .sum();
        System.out.println("total = " + total);

        System.out.println("forEach()는 최종처리 루핑 메소드 - 마지막에 호출한 경우, 동작함");
        Arrays.stream(intArr)
                .filter(a -> a%2 ==0)
                .forEach(n-> System.out.println(n));
    }
}
8. Matching (allMatch(), anyMatch(), noneMatch())
最終処理フェーズでは、要素が特定の条件に合致することを保証するために、マッチングメソッドがサポートされます.
allMatch()
各要素は、与えられた述語値が各値として条件を満たすかどうかをチェックします.
anyMatch()
少なくとも1つ以上の要素が列挙値として使用され、与えられた述語値が条件を満たしているかどうかを確認します.
noneMatch()
各要素は、指定された述語値が列挙値としての条件を満たすかどうかをチェックします.
import java.util.Arrays;

public class MatchExample {
    public static void main(String[] args) {
        int[] intArray = {1, 2, 3, 4, 5};

        boolean result = Arrays.stream(intArray)
                .allMatch(a -> a % 2 == 0);
        System.out.println("모두 2의 배수인가 ? = " + result);

        result = Arrays.stream(intArray)
                .anyMatch(a -> a % 3 == 0);
        System.out.println("3의 배수인 요소가 하나라도 있나 ? = " + result);

        result = Arrays.stream(intArray)
                .noneMatch(a -> a % 7 == 0);
        System.out.println("모든 요소가 7의 배수가 아닌가? = " + result);

    }
}
9.デフォルトカウント(および()、count()、average()、max()、min()
統計は、機能処理要素を最終的に処理します.
カウント、合計、平均値、最値、最切り上げなどの値を計算します.
統計は大量のデータを加工縮小した還元と見なすことができる.
ストリームが提供するデフォルトの集約関数
import java.util.Arrays;

public class AggregateExample {

    public static void main(String[] args) {
        int[] intArr = {1, 2, 3, 4, 5, 6, 7};

        long count = Arrays.stream(intArr)
                .filter(a -> a % 2 == 0)
                .count();
        System.out.println("2의 배수 개수 : " + count);

        long sum = Arrays.stream(intArr)
                .filter(n -> n % 2 == 0)
                .sum();
        System.out.println("2의 배수인 요소들의 합 : " + sum);

        double avg = Arrays.stream(intArr)
                .filter(n -> n % 2 == 0)
                .average()
                .getAsDouble();
        System.out.println("2의 배수인 요소들의 평균, double 타입 : " + avg);

        int max = Arrays.stream(intArr)
                .filter(n -> n % 2 == 0)
                .max()
                .getAsInt();
        System.out.println("2의 배수인 요소들의 최댓값, double 타입 : " + max);

        int first = Arrays.stream(intArr)
                .filter(n -> n % 3 == 0)
                .findFirst()
                .getAsInt();
        System.out.println("3의 배수인 요소들 중에서 가장 첫 요소 : " + first);
    }
}
Optionalクラス
Optionalクラスは集約値を格納するだけでなく、集約値が存在しない場合(空の場合)はポーリング値を設定したり、集約値を処理する顧客を登録したりすることができます.
importjava.util.ArrayList;
importjava.util.List;
importjava.util.OptionalDouble;

public classOptionalExample {

public static voidmain(String[] args) {
        List<Integer> list =newArrayList<>();

//  java.util.NoSuchElementException발생한다.
        //요소 값이 null이기 떄문 !
//        double avg = list.stream()
//                .mapToInt(Integer::intValue)
//                .average()
//                .getAsDouble();

        // 1. isPresent()사용
OptionalDouble optionalAvg = list.stream()
                .mapToInt(Integer::intValue)
                .average();

if(optionalAvg.isPresent()){
            System.out.println("isPresent() 사용 : " + optionalAvg);
        }else{
            System.out.println(0.0);
        }

// 2. orElse
doubleavg = list.stream()
                .mapToInt(Integer::intValue)
                .average()
                .orElse(0.0);

        System.out.println("orElse() 사용 = " + avg);

// 3. ifPresent람다식
list.stream()
                .mapToInt(Integer::intValue)
                .average()
                .ifPresent(a -> System.out.println("ifPresent() 사용 : " + a));

    }
}
10.統計カスタマイズ(reduce()
基本的な統計方法に加えて、reduce()方法も提供され、それをプログラム化して様々な統計結果を作成することができる.

各インタフェースには、各タイプのXXOperator、戻りタイプのOptionalXXX、int、longm doubleを有するreduce()メソッドがあります.
ストリーム要素がない場合は、identityの値が返されます.
XXXOperatorパラメータ値には、統計処理用のram式が導入されています.
import java.util.Arrays;
import java.util.List;

public class ReductionExample {

    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(new Person("홍길동", 20, Person.MALE)
                , new Person("김미미", 21, Person.FEMALE)
                , new Person("JHJ", 22, Person.FEMALE));

        int sum1 = personList.stream()
                .mapToInt(Person::getAge)
                .sum();

        int sum2 = personList.stream()
                .map(Person::getAge)
                .reduce((a, b) -> a + b)
                .get();

        int sum3 = personList.stream()
                .map(Person::getAge)
                .reduce(0, (a, b) -> a + b);

        System.out.println("sum1 = " + sum1);
        System.out.println("sum2 = " + sum2);
        System.out.println("sum3 = " + sum3);
    }
}
ソース:これがJava(作者:竜巻、出版社:韓光メディア)