@@ -365,7 +365,9 @@ import java.io.File;
365
365
import java.io.FileFilter;
366
366
import java.util.Arrays;
367
367
import java.util.List;
368
+ import java.util.Optional;
368
369
import java.util.function.Consumer;
370
+ import java.util.function.Function;
369
371
import java.util.function.Predicate;
370
372
371
373
import org.junit.Test;
@@ -544,6 +546,12 @@ public class LambdaExpressionTest {
544
546
});
545
547
}
546
548
549
+ @Test
550
+ public void testCreationOfReusableFunction() {
551
+ final Function<Integer, Predicate<Student>> marksGreaterThan = minimumMarks -> student -> student
552
+ .getMarks() > minimumMarks;
553
+ }
554
+
547
555
@Test
548
556
public void testPrintStudentsWithMarksGreaterThanWithCustomCheckAndLambda() {
549
557
course.printStudentsSatisfyingCheck((Student student) -> student.getMarks() > 70 && student.getMarks() <= 90);
@@ -568,6 +576,14 @@ public class LambdaExpressionTest {
568
576
.forEach(student -> System.out.println(student));
569
577
}
570
578
579
+ @Test
580
+ public void testPreviousFunctionWithStreams_findFirst() {
581
+ // Optional class is useful whenever the result may be absent.
582
+ Optional<Student> first = course.getStudents().stream()
583
+ .filter(student -> student.getMarks() > 70 && student.getMarks() <= 90).findFirst();
584
+ System.out.println(first.get());
585
+ }
586
+
571
587
@Test
572
588
public void compareStudentsUsingLambdas() {
573
589
// Behavior parameterization
@@ -578,3 +594,189 @@ public class LambdaExpressionTest {
578
594
}
579
595
580
596
```
597
+
598
+ StreamsTest
599
+ ```
600
+
601
+ import static org.junit.Assert.assertEquals;
602
+
603
+ import java.util.ArrayList;
604
+ import java.util.Arrays;
605
+ import java.util.Comparator;
606
+ import java.util.List;
607
+ import java.util.Map;
608
+ import java.util.stream.Collectors;
609
+ import java.util.stream.Stream;
610
+
611
+ import org.junit.Test;
612
+
613
+ public class StreamsTest {
614
+
615
+ @Test
616
+ public void streamsBasics_creatingAStream() {
617
+ List<String> list = Stream.of("Apple", "Banana", "Mango").collect(Collectors.toList());
618
+ assertEquals(Arrays.asList("Apple", "Banana", "Mango"), list);
619
+ }
620
+
621
+ @Test
622
+ public void streamsBasics_mappingAValueToAnother() {
623
+ List<String> collected = Stream.of("Apple", "Banana", "Mango").map(value -> value.toUpperCase())
624
+ .collect(Collectors.toList());
625
+
626
+ assertEquals(Arrays.asList("APPLE", "BANANA", "MANGO"), collected);
627
+ }
628
+
629
+ @Test
630
+ public void streamsBasics_filtering() {
631
+ List<String> initCaps = Stream.of("Apple", "Banana", "mango")
632
+ .filter(value -> Character.isUpperCase(value.charAt(0))).collect(Collectors.toList());
633
+
634
+ assertEquals(Arrays.asList("Apple", "Banana"), initCaps);
635
+ }
636
+
637
+ class Country {
638
+ private String name;
639
+ private long area;
640
+ private long population;
641
+ private String continent;
642
+
643
+ public Country(String name, long area, long population, String continent) {
644
+ super();
645
+ this.name = name;
646
+ this.area = area;
647
+ this.population = population;
648
+ this.continent = continent;
649
+ }
650
+
651
+ public String getName() {
652
+ return name;
653
+ }
654
+
655
+ public long getArea() {
656
+ return area;
657
+ }
658
+
659
+ public long getPopulation() {
660
+ return population;
661
+ }
662
+
663
+ public String getContinent() {
664
+ return continent;
665
+ }
666
+
667
+ @Override
668
+ public String toString() {
669
+ return "Country [name=" + name + ", area=" + area + ", population=" + population + ", continent="
670
+ + continent + "]";
671
+ }
672
+
673
+ }
674
+
675
+ List<Country> countries = Arrays.asList(new Country("India", 10000, 20000, "Asia"),
676
+ new Country("China", 30000, 30000, "Asia"), new Country("USA", 40000, 10000, "North America"));
677
+
678
+ @Test
679
+ public void streamsBasics_min() {
680
+ Country smallestCountryInTheList = countries.stream().min(Comparator.comparing((Country c) -> c.getArea()))
681
+ .get();
682
+ assertEquals("India", smallestCountryInTheList.getName());
683
+ }
684
+
685
+ @Test
686
+ public void streamsBasics_max() {
687
+ Country largestCountryInTheList = countries.stream().max(Comparator.comparing((Country c) -> c.getArea()))
688
+ .get();
689
+ assertEquals("USA", largestCountryInTheList.getName());
690
+ }
691
+
692
+ @Test
693
+ public void streamsBasics_reduce() {
694
+ int count = Stream.of(100, 200, 300).reduce(0, (acc, element) -> acc + element);
695
+ assertEquals(600, count);
696
+ }
697
+
698
+ @Test
699
+ public void streamsBasics_namesOfCountriesWithAreaGreaterThan20000() {
700
+ List<String> countriesWithAreaGreaterThan20000 = countries.stream()
701
+ .filter((Country country) -> country.getArea() > 20000).map(c -> c.getName())
702
+ .collect(Collectors.toList());
703
+ assertEquals(Arrays.asList("China", "USA"), countriesWithAreaGreaterThan20000);
704
+ }
705
+
706
+ @Test
707
+ public void streamsBasics_namesOfCountriesWithAreaGreaterThan20000_methodReferences() {
708
+ List<String> countriesWithAreaGreaterThan20000 = countries.stream()
709
+ .filter((Country country) -> country.getArea() > 20000).map(Country::getName)
710
+ .collect(Collectors.toList());
711
+ assertEquals(Arrays.asList("China", "USA"), countriesWithAreaGreaterThan20000);
712
+ }
713
+
714
+ @Test
715
+ public void streamsBasics_max_methodReferences() {
716
+ Country largestCountryInTheList = countries.stream().max(Comparator.comparing(Country::getArea)).get();
717
+ assertEquals("USA", largestCountryInTheList.getName());
718
+ }
719
+
720
+ @Test
721
+ public void streamsBasics_group() {
722
+ Map<String, List<Country>> countriesGroupedByContinent = countries.stream()
723
+ .collect(Collectors.groupingBy(country -> country.getContinent()));
724
+ System.out.println(countriesGroupedByContinent.get("Asia"));
725
+ }
726
+
727
+ @Test
728
+ public void streamsBasics_groupAndCount() {
729
+ Map<String, Long> countOfCountriesInContinent = countries.stream()
730
+ .collect(Collectors.groupingBy(country -> country.getContinent(), Collectors.counting()));
731
+ assertEquals(2, countOfCountriesInContinent.get("Asia").longValue());
732
+ }
733
+
734
+ @Test
735
+ public void streamsBasics_partition() {
736
+ Map<Boolean, List<Country>> partitionBasedOnContinentAsiaOrNot = countries.stream()
737
+ .collect(Collectors.partitioningBy(country -> country.getContinent().equals("Asia")));
738
+ System.out.println(partitionBasedOnContinentAsiaOrNot.get(true));
739
+ }
740
+
741
+ @Test
742
+ public void streamsBasics_joinAsString() {
743
+ Map<Boolean, List<Country>> partitionBasedOnContinentAsiaOrNot = countries.stream()
744
+ .collect(Collectors.partitioningBy(country -> country.getContinent().equals("Asia")));
745
+
746
+ List<Country> countriesInAsia = partitionBasedOnContinentAsiaOrNot.get(true);
747
+ String joinedByComma = countriesInAsia.stream().map(Country::getName)
748
+ .collect(Collectors.joining(",", "[", "]"));
749
+ assertEquals("[India,China]", joinedByComma);
750
+ }
751
+
752
+ List<Integer> values = new ArrayList<>();
753
+
754
+ {
755
+ for (int i = 1; i < 10000000; i++) {
756
+ values.add(i);
757
+ }
758
+ }
759
+
760
+ @Test
761
+ public void streamsBasics_performance_parallelStream() {
762
+ int sum = values.parallelStream().mapToInt(i -> i).sum();
763
+ System.out.println(sum);
764
+ }
765
+
766
+ @Test
767
+ public void streamsBasics_performance_stream() {
768
+ int sum = values.stream().mapToInt(i -> i).sum();
769
+ System.out.println(sum);
770
+ }
771
+
772
+ @Test
773
+ public void streamsBasics_performance_loop() {
774
+ int sum = 0;
775
+ for (int value : values)
776
+ sum += value;
777
+ System.out.println(sum);
778
+ }
779
+ }
780
+
781
+ ```
782
+
0 commit comments