Es sollte beachtet werden, dass Java 8 Stream sehr praktisch ist, aber nur einen "Flow" bietet. Unter ihnen ist "all Match" sehr gefährlich! Im Gegenteil, wenn Sie es nicht vorsichtig verwenden, treten Nebenwirkungen auf. Dies liegt daran, dass allMatch eine Kurzschlussbewertung durchführt (wenn etwas nicht den Beurteilungsbedingungen entspricht, wird die nachfolgende Verarbeitung nicht fortgesetzt und die Verarbeitung endet dort).
Erstellen Sie eine Klasse, die eine Zeichenfolge enthält, bestimmen Sie, ob die Zeichenfolgenlänge für die Liste, die diese enthält, alle 5 Zeichen oder weniger beträgt, und wenn Daten mit 6 oder mehr Zeichen enthalten sind, dieses Zeichen Ein Programm, das die Zeichenfolge "sorry" anstelle einer Spalte ersetzt. Getestet mit den folgenden vier Verarbeitungsmethoden.
--A. Führen Sie allMatch direkt in der Liste aus --B. Ordnen Sie allMatch in der Stream-Verarbeitung zu und führen Sie es aus --C: Einmal zuordnen und in Liste speichern, dann einen neuen Stream öffnen und allMatch ausführen --D: Filtern Sie die Verarbeitungsergebnisse und vergleichen Sie die Nummer mit der Listenlänge des Ziels, das den Stream streamt.
Beispielcode. Ich denke es ist einfach.
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;
}
}
}
Ergebnis
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: Aufgrund der Kurzschlussauswertung von allMatch wird sorry nur dem zweiten Element zugewiesen, und die Elemente danach bleiben unverarbeitet. --B: Auch wenn Sie map () der Stream-API in die Hände von allMatch () legen, ist das Ergebnis leider dasselbe wie A. --C: Da eine neue Liste einmal erstellt wird, ist sie ineffizient, aber alle Elemente werden korrekt verarbeitet. --D: Dies sollte effizienter sein als c, da keine neue Liste generiert wird. .. ..
Aus dem Obigen können wir ersehen, dass wir verstehen müssen, wie man allMatch richtig verwendet.
Ich persönlich denke, wenn Sie allMatch verwenden, ist dies nur dann der Fall, wenn Sie die Liste auf irgendeine Weise überprüfen möchten. Wenn die Daten wie dieses Mal beschädigt sind oder wenn Sie eine spezielle Verarbeitung durchführen und die Ergebnisse aggregieren, ist es besser, die C- oder D-Methode zu verwenden.
[2017/10/23 09:40 postscript] Natürlich ist allMatch für leere Listen auch wahr, seien Sie also vorsichtig. Das gleiche Ergebnis kann mit der D-Methode erzielt werden.
Wenn Sie Lombok verwenden, wird es einfacher, also lassen Sie es uns verwenden.
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