nico对《Java 8函数式编程》的笔记(33)

  • 第40页
    该注解会强制javac检查一个接口是否符合函数接口的标准。如果该注释添加给一个枚举类型、类或另一个注释,或者接口包含不止一个抽象方法,javac就会报错。
    也可以看出,被@FunctionalInterface注解的接口也可以有静态方法或default方法。
    2016-07-23 15:06:31 回应
  • 第44页
    类中重写的方法优先级高于接口中定义的默认方法。
    简言之,类中重写的方法胜出。这样的设计主要是由默认方法的目的决定的,增加默认方法的目的是为了在接口上向后兼容。让类中重写方法的优先级高于默认方法能简化很多继承问题。
    2016-07-23 22:56:01 回应
  • 第45页
    其实应该称作多重实现。
    例4-19 Jukebox
    public interface Jukebox {
          public default String rock() {
                reutrn "... all over the world!";
          }
    }
    
    例4-20 Carriage
    public interface Carriage {
         public default String rock() {
               return "... from side to side";
         }
    }
    
    例4-21 实现rock方法
    public class MusicalCarriage implements Carriage, Jukebox {
          @Override
          public String rock() {
                return Carriage.super.rock();
          }
    }
    
    多重实现,需要重写默认方法,也可以通过super关键字指明使用哪个接口的默认方法。
    2016-07-23 23:04:41 回应
  • 第48页
    使用Optional对象有两个目的:首先,Optional对象鼓励程序员适时检查变量是否为空,以避免代码缺陷;其次,它将一个类的API中可能为空的值文档化,这比阅读实现代码要简单很多。
    @Test
    public void testOptional() {
    	Optional<String> a = Optional.of("a");
    	Assert.assertEquals("a", a.get());
    	
    	Optional emptyOptional = Optional.empty();
    	Optional alsoEmpty = Optional.ofNullable(null);
    	Assert.assertFalse(emptyOptional.isPresent());
    		
    	Assert.assertTrue(a.isPresent());
    		
    	Assert.assertEquals("b", emptyOptional.orElse("b"));
    		
    	Assert.assertEquals("c", emptyOptional.orElseGet(() -> "c"));
    		
    	System.out.println("emptyOptional: " + emptyOptional.get());//空值不能获取,会抛NoSuchElementException错误
    }
    
    2016-07-23 23:25:12 回应
  • 第51页
    String[]::new
    
    以上String[]类型也行,具体怎么用之后再考虑。
    2016-07-24 16:50:10 回应
  • 第52页
    在一个有序集合中创建一个流时,流中的元素就按出现顺序排列。
    如果集合本身就是无序的,由此生成的流也是无序的。
    List是有序的,HashSet是无序的。
    一些操作在有序的流上开销更大,调用unordered方法消除这种顺序就能解决该问题。大多数操作都是在有序流上效率更高,比如filter、map和reduce等。
    forEach不能保证顺序处理,forEachOrdered能够保证顺序处理。
    2016-07-24 17:06:57 回应
  • 第54页
    例5-5 使用toCollection,用定制的集合收集元素
    stream.collect(Collectors.toCollection(TreeSet::new));
    
    2016-07-24 17:25:19 回应
  • 第55页
    List<String> names = Arrays.asList("Jack", "Linda", "Mark", "JJ", "M");
    		
    Optional<String> maxLength1 = names.stream()
          .collect(Collectors.maxBy(Comparator.comparing(String::length)));
    System.out.println("maxLength1: " + maxLength1);
    		
    Optional<String> maxLength2 = names.stream().
          max(Comparator.comparing(String::length));
    System.out.println("maxLength2: " + maxLength2);
    
    收集器collect方法中使用maxBy方法,但是,与直接使用max方法的效果完全一样。
    Double avgLength = names.stream()
          .collect(Collectors.averagingInt(String::length));
    System.out.println("avgLength: " + avgLength);
    
    收集器collect方法中使用averagingInt方法计算平均值,得到一个Double数值。
    2016-07-24 17:41:20 回应
  • 第55页
    在collect方法中使用partitioningBy方法进行分块。
    通过判断true或false,将数据分成两块。
    List<String> names = Arrays.asList("Jack", "Linda", "Mark", "JJ", "M");
    Map<Boolean, List<String>> partitionMap = names.stream()
    		.collect(Collectors.partitioningBy(s -> s.length() > 3));
    System.out.println("partitionMap: " + partitionMap);
    
    运行结果:
    partitionMap: {false=[JJ, M], true=[Jack, Linda, Mark]}
    2016-07-24 17:55:05 回应
  • 第56页
    在collect方法中使用groupingBy方法进行分组。
    其实数据分块更像是数据分组的子集,如下用groupingBy实现与partitioningBy一样效果的代码。
    Map<Boolean, List<String>> partitionMap = names.stream()
    		.collect(Collectors.partitioningBy(s -> s.length() > 3));
    System.out.println("partitionMap: " + partitionMap);
    	
    Map<Boolean, List<String>> partitionMap2 = names.stream()
    		.collect(Collectors.groupingBy(s -> s.length() > 3));
    System.out.println("partitionMap2: " + partitionMap2);
    
    数据分组更加通用。
    Map<Character, List<String>> groupingMap = names.stream()
          .collect(Collectors.groupingBy(s -> s.charAt(0)));
    System.out.println("groupingMap: " + groupingMap);
    
    通过首字符进行分组,首字符作为Key。
    2016-07-24 18:13:32 回应

nico的其他笔记  · · · · · ·  ( 全部41条 )