1. Kontrol

Veri akışlarını birbirine zincirlemeyi öğrenmekten çoktan sıkılmış olabileceğinizi düşünüyorum. Sonunda verilerle bir şeyler yapmak istiyorsunuz.

Sınıfın Stream, akış oluşturmayan, bunun yerine içlerinde ne tür veriler olduğunu kontrol eden üç standart yöntemi vardır. Bu yöntemler şunlardır: anyMatch(), allMatch()ve noneMatch().

boolean anyMatch(rule)yöntem

Bu yöntem, akışın, yönteme iletilen kuralı karşılayan en az bir öğeye sahip olup olmadığını kontrol eder. Böyle bir öğe varsa, yöntem trueaksi takdirde döndürür false.

örnekler

kod Not
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.anyMatch(x -> x > 0);

true
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).anyMatch(x -> x > 0);

false

Son örnekte, önce yalnızca sıfırdan küçük olan öğeleri tutuyoruz ve ardından filtrelenmiş öğelerden herhangi birinin sıfırdan büyük olup olmadığını görmek için sonucu kontrol ediyoruz. Tabii ki, bu tür unsurlar artık yok.

boole allMatch(kural) yöntemi

Bu yöntem, akıştaki tüm öğelerin kuralla eşleşip eşleşmediğini kontrol eder (yüklem olarak da bilinir). Kural, yönteme bir argüman olarak iletilir:

kod Not
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.allMatch(x -> x > 0);
true
(sıfırdan büyük tüm elemanlar)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.allMatch(x -> x > 0);
false
(sıfırdan küçük veya sıfıra eşit elemanlar var mı?)
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).allMatch(x -> x < 0);
true
(sıfırdan küçük olan elemanları tuttuk)

Son örnekte, önce sadece sıfırdan küçük olan elemanların filtreden geçmesine izin veriyoruz ve ardından tutulan tüm elemanların sıfırdan küçük olup olmadığını kontrol ediyoruz. Kontrol olumlu sonuç verir.

boolean noneMatch(rule) yöntemi

Yöntem noneMatch(), akışın iletilen kuralla eşleşen hiçbir öğeye sahip olup olmadığını kontrol eder. Yöntemin tam tersi gibidir anyMatch().

kod Not
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.noneMatch(x -> x > 0);

false
Stream<Integer> stream = Stream.of(1, -2, 3, -4, 5);
boolean result = stream.filter(x -> x < 0).noneMatch(x -> x > 0);

true

4
Görev
Java Core,  seviyeders
Kilitli
join: at the right time in the right place
The join method is very useful and is often used to terminate a thread. Think about where and on what object you need to call this method to have the result displayed
18
Görev
Java Core,  seviyeders
Kilitli
Horse racing
Programming is better than gambling... Still, horse races and other races perfectly illustrate multithreading! Figure out what the code does, and implement a method that counts the number of horses that have crossed the finish line. One more thing: you need to wait for the longshots to finish the race.

2. Fayda sınıfları: Optionalsınıf

Bazen programcılar için referanslarla çalışmak çok sakıncalıdır null. Örneğin, iki diziyi karşılaştırdığınızı varsayalım. Her iki değişken de değilse null, o zaman basitçe arayabilirsiniz s1.equals(s2)ve her şey çalışacaktır. Ama eğer s1olabilirse null, o zaman a'dan kaçınmak için bu durumu işleyen bir kod yazmanız gerekir NullPointerException.

Bu yüzden programcılar fayda sınıfını buldular Optional<T>. Kodu kabaca şöyle görünür:

kod Not
class Optional<Type>
{
   private final T type value;
   private Optional() { this.value = null;}
   private Optional(value) { this.value = value;}
   public static <Type> Optional<Type> of(Type value)
   {
      return new Optional<Type>(value);
   }

   public boolean isPresent()
   {
      return value != null;
   }

   public boolean isEmpty()
   {
      return value == null;
   }

   public Type get()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }

   public Type orElse(Type other)
   {
      return value != null ? value : other;
   }

   public Type orElseThrow()
   {
      if (value == null)
      {
         throw new NoSuchElementException();
      }
      return value;
   }
}










Değerin olup olmadığını kontrol eder Değerin olup olmadığını null



kontrol eder null




Saklanan değeri döndürür. Değer null ise bir istisna atar.







Saklanan boş olmayan değeri döndürür. Veya depolanan değer ise null, yöntem bağımsız değişkeni olarak iletilen değeri döndürür.



Saklanan null olmayan değeri döndürür veya değer null ise bir istisna atar.

Bu sınıfın amacı basitçe bir T nesnesini (türü T olan bir nesneye referans) depolamaktır. Bir nesnenin içindeki nesne referansı Optional<T>olabilir null.

Bu sınıf, programcıların biraz daha güzel kod yazmasına izin verir. Hadi karşılaştıralım:

İsteğe Bağlı Kullanma İsteğe bağlı kullanmamak
public void printString(String s)
{
   Optional<String> str = Optional.ofNullable(s);
   System.out.println(str.orElse(""));
}
public void printString(String s)
{
   String str = s != null ? s : "";
   System.out.println(str)
}

Bir nesne, referansları depolasalar bile, yöntem kullanılarak Optionalher zaman başka bir nesneyle karşılaştırılabilir .Optionalequalsnull

Basitçe söylemek gerekirse, sınıf, bir nesnenin bir değer depolaması durumunda Optional"güzel" kontroller ve "güzel" eylemler yazmanıza izin verir .nullOptionalnull


9
Görev
Java Core,  seviyeders
Kilitli
Promotion during political debates
Mr Chump is our candidate! And we'll help him a bit by making him give a speech, and then another, and then another during a political debate. We'll help him a little by making him talk until all the available time has been taken. Threads come to our rescue!

3. Öğeleri bulma

Sınıfa dönelim Stream. Sınıfın Stream, bir akıştaki öğeleri aramanıza izin veren 4 yöntemi daha vardır. Bu yöntemler findFirst(), findAny(), min()ve max().

Optional<T> findFirst()yöntem

Yöntem findFirst(), akıştaki ilk öğeyi döndürür. Tüm yaptığı bu.

Burada dikkat edilmesi gereken daha ilginç olan şey, yöntemin bir Tnesne değil, bir Optional<T>sarmalayıcı nesne döndürmesidir. Bu, yöntemin nullbir nesne bulamadıktan sonra asla geri dönmemesini sağlar.

Örnek:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String str = list.stream().findFirst().get(); // Hello

Daha fazla açıklığa kavuşturmak için, son satırı birkaç satıra ayıralım:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Stream<String> stream = list.stream();
Optional<String> result = stream.findFirst();
String str = result.get(); // Hello

Son get()yöntem, basitçe nesnenin içinde depolanan değeri alır Optional.

Optional<T> findAny()yöntem

Yöntem findAny(), akıştan herhangi bir öğeyi döndürür ve burada biter. Bu yönteme benzer findFirst(), ancak paralel işlemlerde kullanılan akışlar için harikadır.

Akışları paralel olarak işlerken, bir akışın bazı bölümlerinde zaten bulunmuş bir öğe olabilir, ancak bunun ilk olup olmadığı henüz net değil.

Birçok öğe tüm filtrelerle eşleşiyorsa ve programcının bunlardan tam olarak ilkini alması önemliyse, o zaman yöntem, findFirst()çağrılması gereken şeydir. Programcı gerçekte 0 veya 1 öğenin tüm filtrelerle eşleşeceğini biliyorsa, o zaman basitçe çağırmak yeterlidir findAny()- ve bu daha hızlı olacaktır.

Optional<T> min(Comparator<T>)yöntem

Yöntem , akıştaki tüm öğeleri karşılaştırmak için min()bir nesne kullanır ve minimum öğeyi döndürür. comparatorKarşılaştırma nesnesi tanımlamanın en uygun yolu lambda işlevi kullanmaktır.

En kısa diziyi aramaya örnek:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String min = list.stream().min( (s1, s2)-> s1.length()-s2.length() ).get();

Optional<T> max(Comparator<T>)yöntem

Yöntem , akıştaki tüm öğeleri karşılaştırmak için max()bir nesne kullanır ve maksimum öğeyi döndürür. comparatorKarşılaştırma nesnesi tanımlamanın en uygun yolu lambda işlevi kullanmaktır.

En uzun diziyi arama örneği:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");
String max = list.stream().max( (s1, s2)-> s1.length()-s2.length() ).get();
4
Görev
Java Core,  seviyeders
Kilitli
Justice
Justice is the name of an ancient Terrian deity that no one ever saw in the flesh. That said, Justice is sometimes encountered in man-made systems. We've got some mice here. For some reason, one of the mice, the alpha male, eats first while the others wait. Figure out why and remove this method call.
9
Görev
Java Core,  seviyeders
Kilitli
Arranging calls to join()
First, the cat gives birth to kittens. Then all the kittens climb out of the basket in random order. Finally, the cat brings them back into the basket. These events for one cat may be interspersed with events for another cat. Now implement this scenario with join().