[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()演算
これは、
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
Reference
この問題について([Java]Streams(ストリーム)), 我々は、より多くの情報をここで見つけました https://velog.io/@seongwon97/Java-Stream-스트림テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol