我々は大規模なデータファイルに遭遇したとき、どのようにそれを扱うでしょうか?
私たちは、その結果を出力し、別のスレッドで処理され、それぞれの多くのセクションに分かれます。
反復子(イテレータ)のようなストリーミング、一方向、往復運動しない、データは一度だけ横断することができます。
並行して、ストリームの操作、唯一不可欠イテレータ、シリアル化操作。名前が示唆するように、場合シリアルモードが横断し、その後次の項目を読み取るために各項目を読み出します。パラレルデータをトラバースするために使用される場合、複数のセグメントに分割されている別のスレッドで処理された各々が、その後一緒に結果を出力します。
コレクション改善
1.forEach()出力をサポート:デフォルトのボイドのforEach(コンシューマー・アクション<スーパーT?>)
2.ストリームストリームオブジェクト取得:デフォルトのストリームストリーム
のためのコード:
public static void main(String[] args) {
List<String> list=new ArrayList<>();
Collections.addAll(list,"Zhangsan","LisI","Wangwu","Like","zhangyi","want");
list.forEach(s-> System.out.println(s)); //lambda表达式
System.out.println("===>");
list.forEach(System.out::println); //方法引用
System.out.println("===>");
// System.out.println(list.size());
System.out.println(list.stream().count());
List<String> newlist=new ArrayList<>();
for (String item : list) {
if (item.contains("Li")) { //foreach循环
newlist.add(item);
}
}
System.out.println(newlist);
}
ストリーム動作:
1.count()方法:データの量は、統計演算するために
2.filter()メソッド:データ濾過
濾過後に特定のデータを受信する3願いを、コレクタを完了するために使用することができます。
コレクター:パブリック<R、A> R集める(<?スーパーT、A、R>コレクタコレクタ)
データがまだ収集されたリストの集合に属し、リストを受信することができ、直接
操作ストリームインタフェースの二つの方法に焦点を当て:
- 提供される最大のコンテンツを削除する:パブリックストリーム限界(長いmaxSizeの)。
- データ量をスキップ:スキップ公共ストリーム(ロングN);
ストリームスキップ(N)メソッドをサポートするストリームは、最初のn個の要素を投げ返します。ストリームは、n番目の要素、空のストリームよりも小さい場合。限界(n)とスキップ(N)に相補的である
ストリーム支持マップ方法は、パラメータとして関数を受け入れます。この関数は、各要素に適用され、そして新しい要素にそれをマッピングしています。
。一覧リスト= list.skip(0) .limit(2).MAP(S> s.toUpperCase())を収集(Collectors.toList());
のコード:
import com.sun.org.apache.xpath.internal.SourceTree;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
public class TestStream {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
Collections.addAll(list,"Zhangsan","LisI","Wangwu","Like","zhangyi","want");
list.forEach(s-> System.out.println(s));
System.out.println("===>");
list.forEach(System.out::println); //方法引用
System.out.println("===>");
// System.out.println(list.size());
System.out.println(list.stream().count());
List<String> newlist=new ArrayList<>();
for (String item : list) {
if (item.contains("Li")) { //foreach循环
newlist.add(item);
}
}
System.out.println(newlist);
System.out.println(list.stream().filter(s->s.contains("Li")).count()); //过滤出包含li的然后计算
//将字符串转换为小写,然后过滤出含有l的并且长度大于2 的字符串
System.out.println(list.stream().map(String::toLowerCase).filter(s -> s.contains("l")).filter(s -> s.length() > 2).collect(Collectors.toList()));
//跳跃两个值,取跳跃后的三个,并且包含i的
System.out.println(list.stream().skip(2).limit(3).filter(s->s.contains("i")).collect(Collectors.toList()));
}
}
実行結果:
parallelstream()メソッド:マルチコアは、マルチスレッドの速度を向上させること、並行して行います。
シングルコアCPU環境、パラレルストリーム、データのCPUのマルチコア大量にはお勧めしませんし、条件があり、推奨parallestream
MapReduceのモデル:
MapReduceのは、全体の流れの中核です。MapReduceの操作は、2つの段階で構成されています。
- マップ():データに対して行う操作前処理を意味します。たとえば、次の簡単な数学演算など
- 低減()のためのデータの統計学的分析
統計学的分析:公共DoubleStream mapToDouble(<スーパーToDoubleFunction ?T>マッパー);
この場合、方法はDoubleStreamインタフェースオブジェクトを返し、統計的操作があるが、使用される統計的方法を完成させることができます次のように
統計的手法:DoubleStream mapToDouble(ToDoubleFunctionマッパ<スーパー T?>);
例:統計処理:
のコード:
package Price;
public class Order {
private String title;
private double price;
private int amount;
public Order(String title, double price, int amount) {
this.title = title;
this.price = price;
this.amount = amount;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
}
package Price;
import java.util.ArrayList;
import java.util.DoubleSummaryStatistics;
import java.util.List;
public class MapReduce {
public static void main(String[] args) {
List<Order> oderlist = new ArrayList<>();
oderlist.add(new Order("Iphone", 8999.99, 10));
oderlist.add(new Order("外星人笔记本", 12999.99, 5));
oderlist.add(new Order("MacBookPro", 18999.99, 5));
oderlist.add(new Order("Java从入门到放弃.txt", 9.99, 20000));
oderlist.add(new Order("中性笔", 1.99, 200000));
double totalPrice=0.0D;
for(Order od:oderlist){
totalPrice+= od.getPrice()*od.getAmount();
}
System.out.println("总钱数为:"+totalPrice);
System.out.println("===>方法");
Double totalPrice1=oderlist.stream().map(order -> order.getAmount() * order.getPrice()).reduce((sum, x) -> sum + x).get(); //lambda表达式
Double totalPrice2 = oderlist.stream().map(order -> order.getAmount() * order.getPrice()).reduce(Double::sum).orElseGet(()->0.0D);//方法引用
Double totalPrice3 = oderlist.stream().mapToDouble(order -> order.getAmount() * order.getPrice()).reduce(Double::sum).orElseGet(()->0.0D);
System.out.println(totalPrice1);
System.out.println(totalPrice2);
System.out.println(totalPrice3);
System.out.println("====>");
DoubleSummaryStatistics statistics = oderlist.stream().mapToDouble(order -> order.getPrice() * order.getAmount()).summaryStatistics();
System.out.println("总订单数:" + statistics.getCount());
System.out.println("总金额:" + statistics.getSum());
System.out.println("最大金额:" + statistics.getMax());
System.out.println("最小金额:" + statistics.getMin());
System.out.println("平均金额:" + statistics.getAverage());
}
}
ストリームの特性
1.一度だけ横断:
パイプラインを通じて要素は、もはや操作することができたときに、データの取得元からのデータストリームを、要素が続くが、ライン上で動作していない、あなたは、新しいデータソースを取得することができますデータ・ストリームを動作させるステップと、
前記内部反復的使用:
コレクションは、典型的には、外部の反復であるイテレータウォーカートラバーサルを使用して、処理され、
そして治療ストリームについて、限り記載された手法として、プロセスストリームオブジェクトによって自己完了、内部反復外部反復より効率的に内部反復、大量のデータのための反復プロセスです。