Il est à noter que Java 8 Stream est très pratique, mais il ne fournit qu'un "flux". Parmi eux, «All Match» est très dangereux! Au contraire, si vous ne l'utilisez pas avec précaution, des effets secondaires se produiront. En effet, allMatch évalue un court-circuit (s'il y a quelque chose qui ne remplit pas les conditions de jugement, le traitement suivant n'est pas poursuivi et le traitement s'arrête là).
Créez une classe qui contient une chaîne de caractères, déterminez si la longueur de la chaîne de caractères est de 5 caractères ou moins pour la liste qui la contient, et si des données de 6 caractères ou plus sont incluses, ce caractère Un programme qui remplace la chaîne «désolé» au lieu d'une colonne. Testé avec les quatre méthodes de traitement suivantes.
--A. Exécuter allMatch directement sur la liste --B. Mappez puis exécutez allMatch dans le traitement de flux --C: mappez et enregistrez une fois dans la liste, puis ouvrez un nouveau flux et exécutez allMatch --D: filtrez les résultats du traitement et comparez le nombre avec la longueur de la liste de la cible qui diffuse le Stream.
Exemple de code. Je pense que c'est facile.
MyProject.java
public class MyProject {
public static void main(String[] args) {
List<String> baseStrList = Arrays.asList("test", "tetetete", "tetetete", "tetetete", "tetetete");
List<TestData> listA = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
List<TestData> listB = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
List<TestData> listC = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
List<TestData> listD = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
boolean a = listA.stream().allMatch(TestData::checkLength);
boolean b = listB.stream().map(TestData::checkLength).allMatch(e -> e);
List<Boolean> list3Temp = listC.stream().map(TestData::checkLength).collect(Collectors.toList());
boolean c = list3Temp.stream().allMatch(e -> e);
boolean d = listD.size() == listD.stream().filter(TestData::checkLength).count();
System.out.println("a:" + a + ", list:" + listA.toString());
System.out.println("b:" + b + ", list:" + listB.toString());
System.out.println("c:" + c + ", list:" + listC.toString());
System.out.println("d:" + d + ", list:" + listD.toString());
}
public static class TestData {
public String content = "fefe";
@Override
public String toString() {
return content;
}
public TestData(String a) {
this.content = a;
}
public boolean checkLength() {
if (getContent().length() > 5) {
setContent("sorry");
return false;
}
return true;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
}
résultat
a:false, list:[test, sorry, tetetete, tetetete, tetetete]
b:false, list:[test, sorry, tetetete, tetetete, tetetete]
c:false, list:[test, sorry, sorry, sorry, sorry]
d:false, list:[test, sorry, sorry, sorry, sorry]
--A: En raison de l'évaluation des courts-circuits de allMatch, sorry est attribué uniquement au deuxième élément, et les éléments qui suivent sont laissés non traités. --B: Même si vous mettez map () de Stream API, elle est entre les mains de allMatch (), donc malheureusement le résultat est le même que A. --C: Puisqu'une nouvelle liste est créée une fois, elle est inefficace, mais tous les éléments sont traités correctement. --D: Cela devrait être plus efficace que c car il ne génère pas de nouvelle liste. .. ..
De ce qui précède, nous pouvons voir que nous devons comprendre comment utiliser correctement allMatch.
Personnellement, lorsque vous utilisez allMatch, je pense que ce n'est que lorsque vous souhaitez vérifier la liste d'une manière ou d'une autre. Si les données sont corrompues comme cette fois, ou si vous effectuez un traitement spécial et agrégez les résultats, il semble préférable d'utiliser la méthode C ou D.
[2017/10/23 09:40 postscript] De plus, bien sûr, allMatch pour les listes vides est vrai, alors soyez prudent. Le même résultat peut être obtenu avec la méthode D.
Si vous utilisez lombok, ce sera plus facile, alors utilisons-le.
MyProject.java
import lombok.Data;
import lombok.val;
import java.util.Arrays;
import java.util.stream.Collectors;
public class MyProject {
public static void main(String[] args) {
val baseStrList = Arrays.asList("test", "tetetete", "tetetete", "tetetete", "tetetete");
val listA = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
val listB = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
val listC = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
val listD = baseStrList.stream().map(TestData::new).collect(Collectors.toList());
val a = listA.stream().allMatch(TestData::checkLength);
val b = listB.stream().map(TestData::checkLength).allMatch(e -> e);
val list3Temp = listC.stream().map(TestData::checkLength).collect(Collectors.toList());
val c = list3Temp.stream().allMatch(e -> e);
val d = listD.size() == listD.stream().filter(TestData::checkLength).count();
System.out.println("a:" + a + ", list:" + listA.toString());
System.out.println("b:" + b + ", list:" + listB.toString());
System.out.println("c:" + c + ", list:" + listC.toString());
System.out.println("d:" + d + ", list:" + listD.toString());
}
@Data
public static class TestData {
public String content = "fefe";
@Override
public String toString() {
return content;
}
public TestData(String a) {
this.content = a;
}
public boolean checkLength() {
if (getContent().length() > 5) {
setContent("sorry");
return false;
}
return true;
}
}
}
Recommended Posts