Em Java 8, a operação de fluxo de dados Stream simplifica muito a operação de coleta. Depois de aprender o Stream, podemos realizar muitas operações na coleção sem o loop for.
Artigo Diretório
Inicialização do Stream
Todas as operações de fluxo em Java são para objetos de fluxo, portanto, você deve inicializar para que os objetos do tipo Fluxo usem Fluxo:
-
Inicialização do fluxo:
Stream stream = Stream.of("a","b","c");
-
Converta a matriz em um fluxo:
String [] strArray = new String[]{ "a","b","c"}; Stream stream = Stream.of(strArray); //或者 Stream stream = Arrays.stream(strArray);
-
O objeto da coleção é convertido em um fluxo:
List<String> list = Arrays.asList(strArray); stream = list.stream();
Operação de fluxo
1. Operação transversal (mapa)
Use a operação de mapa para percorrer cada objeto na coleção e operar nele;
Após a operação do mapa, .collect(Collectors.toList())
o conjunto após a operação pode ser obtido usando -o.
por exemplo:
//1.1 遍历并转换为大写
List<String> output = wordList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
//1.2 对每个元素进行平方计算
List<Integer> nums = Arrays.asList(1,2,3,4);
List<Integer> squareNums = nums.stream()
.map(n->n*n)
.collect(Collectors.toList());
2. Operação de filtragem (filtro)
O filtro pode ser usado para filtrar os elementos de dados no fluxo e os elementos filtrados serão retidos para gerar um novo fluxo.
List<String> filterLists = new ArrayList<>();
filterLists.add("");
filterLists.add("a");
filterLists.add("b");
List afterFilterLists = filterLists.stream()
.filter(s->!s.isEmpty())
.collect(Collectors.toList());
3. Operação de loop (forEach)
Para operações personalizadas em cada objeto no Stream , você pode usar forEach:
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.stream().forEach(s->System.out.println(s));
4. Retorne um conjunto de resultados específico (limite / pulo)
- limit retorna os primeiros n elementos do fluxo
- pular é pular os primeiros n elementos
List<String> forEachLists = new ArrayList<>();
forEachLists.add("a");
forEachLists.add("b");
forEachLists.add("c");
forEachLists.add("d");
forEachLists.add("e");
forEachLists.add("f");
List<String> limitLists = forEachLists.stream()
.skip(2)
.limit(3)
.collect(Collectors.toList());
//先跳过前2个元素
//再取Stream剩余元素的前3,生成新的Stream并返回
5. Classificar (classificar / mínimo / máximo / distinto)
- sort pode classificar todos os elementos da coleção.
- max, min pode encontrar o maior / menor elemento no Stream.
- Distinct pode descobrir os elementos únicos.
//1.对集合排序
List<Integer> sortLists = new ArrayList<>();
sortLists.add(1);
sortLists.add(4);
sortLists.add(6);
sortLists.add(3);
sortLists.add(2);
List<Integer> afterSortLists = sortLists.stream()
.sorted((In1,In2)->In1-In2)
.collect(Collectors.toList());
//2.获取最大长度的元素
List<String> maxLists = new ArrayList<>();
maxLists.add("a");
maxLists.add("b");
maxLists.add("c");
maxLists.add("d");
maxLists.add("e");
maxLists.add("f");
maxLists.add("hahaha");
int maxLength = maxLists.stream() //获取列表中最长元素的长度
.mapToInt(s->s.length())
.max().getAsInt();
//3.对集合进行查重
List<String> distinctList = new ArrayList<>();
distinctList.add("a");
distinctList.add("a");
distinctList.add("c");
distinctList.add("d");
List<String> afterDistinctList = distinctList.stream()
.distinct()//去重
.collect(Collectors.toList())
6. Correspondência (relacionada à correspondência)
Às vezes, precisamos determinar se todas as condições no conjunto atendem às condições, ou se há elementos que atendem às condições no conjunto, então podemos usar o método de correspondência:
- allMatch: Todos os elementos no stream são adicionados ao predicado passado e retornam true;
- anyMatch: Qualquer elemento no Stream corresponde ao predicado de entrada e retorna verdadeiro;
- noneMatch: Se não houver nenhum elemento no Stream que corresponda ao predicado passado, retorna true;
List<String> matchList = new ArrayList<>();
matchList.add("a");
matchList.add("");
matchList.add("a");
matchList.add("c");
matchList.add("d");
//1.判断集合中是否存在“c”的字符串元素
Boolean isExits = matchList.stream()
.anyMatch(s->s.equals("c"));
//2.判断集合中是否全不为空
Boolean isAllNull = matchList.stream()
.allMatch(s->s.isNotEmpty());
Boolean isAllNull2 = matchList.stream()
.noneMatch(s->s.isEmpty());