序文
継続的な記事では、新機能java8析出し、追加するためにポイントを作った焦点は、ここでは明らかにならないように、これはjava8ストリームを強調し、大きすぎる記事によると。
基本命令
- ストリームはラムダ式のjava8に基づいており、わからないラムダ式ならば、あなたは私の最後の記事見ることができますラムダ式や関数はすぐにインターフェイスを理解します
- 要素のストリームは、ストリーミング処理として見パイプラインにストリーミングする、パイプラインは、マッピング、重合等グループをソート、フィルタリング、デエンファシスを備え、ノードデータに処理することができます。
- 動作及び後処理動作の途中にストリームは、ストリームの新たな暫定動作を形成するであろうが、すぐ後の動作に、データを処理しないし、その後セット全体を通して、直接中間後処理操作を操作することができません。
ストリーミングする方法を作成します。
- 使用する
java.util.Collection
デフォルトのインターフェイスメソッドをstream
かparallelStream
- 使用
java.util.Arrays
の方法stream
ストリームにアレイを
ミッド操作および術後
動作及び後処理動作の途中にストリームは、ストリームの新たな暫定動作を形成するであろうが、すぐ後の動作に、データを処理しないし、その後セット全体を通して、直接中間後処理操作を操作することができません。
ミッド操作
- 別の型に1種類をマッピングするためのマップやマップ等、
- 望ましくない要素をフィルタリングするためのフィルタ
- 重複のための明確な
- ソートするソート
- 平らな流れのためflatMap
ポスト操作
forEachのは、anyMatch、allMatch、noneMatch、FindFirstの等を、収集減らします。
最も一般的に使用される、リスト、セット、地図などにセットを有効にするために使用することができコレクターを収集するために、専用のクラスがあり収集に属します
サンプルコード
データ準備
- 検査対象物の以下の例を準備
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Vehicle {
//车架号
private String vin;
// 车主手机号
private String phone;
// 车主姓名
private String name;
// 所属车租车公司
private Integer companyId;
// 个人评分
private Double score;
//安装的设备列表imei,使用逗号分隔
private String deviceNos;
}
- 一部の車両データを準備します
static List<Vehicle> vehicles = new ArrayList<>();
@Before
public void init(){
List<String> imeis = new ArrayList<>();
for (int i = 0; i <5 ; i++) {
List<String> singleVehicleDevices = new ArrayList<>();
for (int j = 0; j < 3; j++) {
String imei = RandomStringUtils.randomAlphanumeric(15);
singleVehicleDevices.add(imei);
}
imeis.add(StringUtils.join(singleVehicleDevices,','));
}
vehicles.add(new Vehicle("KPTSOA1K67P081452","17620411498","9420",1,4.5,imeis.get(0)));
vehicles.add(new Vehicle("KPTCOB1K18P057071","15073030945","张玲",2,1.4,imeis.get(1)));
vehicles.add(new Vehicle("KPTS0A1K87P080237","19645871598","sanri1993",1,3.0,imeis.get(2)));
vehicles.add(new Vehicle("KNAJC526975740490","15879146974","李种",1,3.9,imeis.get(3)));
vehicles.add(new Vehicle("KNAJC521395884849","13520184976","袁绍",2,4.9,imeis.get(4)));
}
forEachを横断するデータの収集
vehicles.forEach(vehicle -> System.out.println(vehicle));
//这样就可以遍历打印
vehicles.forEach(System.out::println);
forEachのは、地図データを反復します
Map<String,Integer> map = new HashMap<>();
map.put("a",1);map.put("b",2);map.put("c",3);
map.forEach((k,v) -> System.out.println("key:"+k+",value:"+v));
フィルタリングデータフィルタ
// 去掉评分为 3 分以下的车
List<Vehicle> collect = vehicles.stream().filter(vehicle -> vehicle.getScore() >= 3).collect(Collectors.toList());
マップオブジェクトマップ
一つは、List<Object>
ほとんどの場合、我々は唯一の列リスト、または別のオブジェクトに各オブジェクトの内部を変換する必要が、あなたはマップのマッピング例を使用することができます。この時間が必要になります。
// 取出所有的车架号列表
List<String> vins = vehicles.stream().map(Vehicle::getVin).collect(Collectors.toList());
属性によってグループ化されGROUPBY
// 按照公司 Id 进行分组
Map<Integer, List<Vehicle>> companyVehicles = vehicles.stream().collect(Collectors.groupingBy(Vehicle::getCompanyId));
// 按照公司分组求司机打分和
Map<Integer, Double> collect = vehicles.stream().collect(Collectors.groupingBy(Vehicle::getCompanyId, Collectors.summingDouble(Vehicle::getScore)));
ソートソート属性によって、および複数列のソート
// 单列排序
vehicles.sort((v1,v2) -> v2.getScore().compareTo(v1.getScore()));
// 或使用 Comparator 类来构建比较器,流处理不会改变原列表,需要接收返回值才能得到预期结果
List<Vehicle> collect = vehicles.stream().sorted(Comparator.comparing(Vehicle::getScore).reversed()).collect(Collectors.toList());
// 多列排序,score 降序,companyId 升序排列
List<Vehicle> collect = vehicles.stream().sorted(Comparator.comparing(Vehicle::getScore).reversed()
.thenComparing(Comparator.comparing(Vehicle::getCompanyId)))
.collect(Collectors.toList());
データ処理を平坦化flatMap
// 查出所有车绑定的所有设备
List<String> collect = vehicles.stream().map(vehicle -> {
String deviceNos = vehicle.getDeviceNos();
return StringUtils.split(deviceNos,',');
}).flatMap(Arrays::stream).collect(Collectors.toList());
flatMapが適切であるList<List>
か、List<object []>
このような構成は、リストとして処理することができる。上記のようにデバイスのリスト、データベース構造に格納されるコンマで区切られたデータであり、リストは、車両データのリストです。
地図にリストデータ
// 将 List 转成 Map ; key(vin) == > Vehicle
Map<String, Vehicle> vinVehicles = vehicles.stream().collect(Collectors.toMap(Vehicle::getVin, vehicle -> vehicle));
MapReduceのデータ処理
// 对所有司机的总分求和
Double reduce = vehicles.stream().parallel().map(Vehicle::getScore).reduce(0d, Double::sum);
割合を求めて
// 总的分值
Double totalScore = vehicles.stream().parallel().map(Vehicle::getScore).reduce(0d, Double::sum);
// 查看每一个司机占的分值比重
List<String> collect = vehicles.stream()
.mapToDouble(vehicle -> vehicle.getScore() / totalScore)
.mapToLong(weight -> (long) (weight * 100))
.mapToObj(percentage -> percentage + "%")
.collect(Collectors.toList());
anyMatch / allMatch / noneMatchマッチング動作
- 要素に一致するようanyMatch長い、すなわち、trueを返します
- allMatchは、すべての要素が一致している必要が
- noneMatchは一致する要素を必要としません
// 检查是否有姓李的司机 true
boolean anyMatch = vehicles.stream().anyMatch(vehicle -> vehicle.getName().startsWith("李"));
// 检查是否所有司机的评分都大于 3 分 false
boolean allMatch = vehicles.stream().allMatch(vehicle -> vehicle.getScore() > 3);
// 检查是否有 3 公司的特务 true
boolean noneMatch = vehicles.stream().noneMatch(vehicle -> vehicle.getCompanyId() == 3);
リトル・プロモーション
書き込みは容易ではない、私はバグを入れて、オープンソースソフトウェアのサポートを期待して、私のガジェット、ポイントスター、フォークをgiteeを歓迎します。
エクセル共通インポートおよびエクスポートは、Excelの数式のサポート
:ブログのアドレスhttps://blog.csdn.net/sanri1993/article/details/100601578
gitee:https://gitee.com/sanri/sanri-excel-poiを
ガジェットは、データベースからコードを生成、テンプレートコードを使用し、いくつかのプロジェクトは、多くの場合に使用することができます
ブログのアドレス:https://blog.csdn.net/sanri1993/article/details/98664034
gitee:https://gitee.com/ sanri / sanri-ツール-達人