java中的方法引用

java中的方法引用,java,java-8,method-reference,Java,Java 8,Method Reference,我正在探索java中的方法引用,只是好奇下面的内容是否可以转换为方法引用 List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); list.forEach(item -> new SomeClass(item).someMethod(item)); 有四种类型的方法引用,您可以根据java规范使用,您只能使用这种类型的方法引用 List<Integer> list = Arrays.asList(1,

我正在探索java中的方法引用,只是好奇下面的内容是否可以转换为方法引用

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
list.forEach(item -> new SomeClass(item).someMethod(item));

有四种类型的方法引用,您可以根据java规范使用,您只能使用这种类型的方法引用

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
list.forEach(item -> new SomeClass(item).someMethod(item));
  • 对静态方法的引用Class::staticMethodName
  • 对构造函数的引用ClassName::new
  • 对特定类型的任意对象的实例方法的引用lass::instanceMethodName

  • 对特定对象的实例方法的引用对象::instanceMethodName


  • 有四种类型的方法引用,您可以根据java规范使用,您只能使用这种类型的方法引用

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
    list.forEach(item -> new SomeClass(item).someMethod(item));
    
  • 对静态方法的引用Class::staticMethodName
  • 对构造函数的引用ClassName::new
  • 对特定类型的任意对象的实例方法的引用lass::instanceMethodName

  • 对特定对象的实例方法的引用对象::instanceMethodName


  • 没有办法以您提供的方式解决问题。但是可以通过将
    someMethod
    方法定义为
    static

    list.forEach(item -> SomeClass.someMethod(item));
    list.forEach(SomeClass::someMethod);
    
    语句
    SomeClass::new::someMethod
    不正确。 严格来说,
    SomeClass::new
    指的是一段构造函数代码(如
    使用者
    ),当您需要一个对象来进行方法引用时,它不会返回新实例
    SomeClassinstance::someMethod

    编辑:
    我真的不认为这种方法有什么好处:

    map(SomeClass::new).forEach(SomeClass::someMet‌hod)
    

    因为它会导致创建一部分无用的
    SomeClass
    实例,其中包含
    s,这些项也不会被使用。

    无法以您提供的方式解决此问题。但是可以通过将
    someMethod
    方法定义为
    static

    list.forEach(item -> SomeClass.someMethod(item));
    list.forEach(SomeClass::someMethod);
    
    语句
    SomeClass::new::someMethod
    不正确。 严格来说,
    SomeClass::new
    指的是一段构造函数代码(如
    使用者
    ),当您需要一个对象来进行方法引用时,它不会返回新实例
    SomeClassinstance::someMethod

    编辑:
    我真的不认为这种方法有什么好处:

    map(SomeClass::new).forEach(SomeClass::someMet‌hod)
    

    因为它会导致创建一部分无用的
    SomeClass
    实例,其中包含
    s,这些项也不会被使用。

    这是一个选项吗

    Function<Integer, SomeClass> f = SomeClass::new;
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
    list.forEach(i -> f.apply(i).someMethod());
    

    这是一种可能的选择吗

    Function<Integer, SomeClass> f = SomeClass::new;
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
    list.forEach(i -> f.apply(i).someMethod());
    

    我想到了下面的代码。尽管如此,它并没有使用方法引用,但应该比命令式编码更具可读性

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
    Function<Integer, SomeClass> someClass = SomeClass::new;
    BiConsumer<SomeClass, Integer> someMethod = SomeClass::someMethod;
    list.forEach(item -> someMethod.accept(someClass.apply(item), item));
    
    List List=Arrays.asList(1,2,3,4,5,6,7,8);
    函数someClass=someClass::new;
    双消费者someMethod=SomeClass::someMethod;
    list.forEach(item->someMethod.accept(someClass.apply(item),item));
    
    我想到了以下代码。尽管如此,它并没有使用方法引用,但应该比命令式编码更具可读性

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);
    Function<Integer, SomeClass> someClass = SomeClass::new;
    BiConsumer<SomeClass, Integer> someMethod = SomeClass::someMethod;
    list.forEach(item -> someMethod.accept(someClass.apply(item), item));
    
    List List=Arrays.asList(1,2,3,4,5,6,7,8);
    函数someClass=someClass::new;
    双消费者someMethod=SomeClass::someMethod;
    list.forEach(item->someMethod.accept(someClass.apply(item),item));
    
    否,
    ::
    与“管道”不兼容。@WillemVanOnsem是否可以使用使用
    列表创建的对象。forEach(SomeClass::new)
    调用
    someMethod
    ?为什么要在
    someMethod
    调用中再次包含
    ?如果没有必要,您可以执行类似于
    list.stream().map(SomeClass::new).forEach(SomeClass::someMethod)
    的操作。如果需要,您可以声明一个新方法来完成您想要的任务,然后使用引用它。您不能使用伸缩方法引用,不,
    不适用于“管道”@WillemVanOnsem是否可以使用使用
    list.forEach(SomeClass::new)
    创建的对象调用
    someMethod
    ?为什么要在
    someMethod
    调用中再次包含
    ?如果没有必要,您可以执行类似于
    list.stream().map(SomeClass::new).forEach(SomeClass::someMethod)
    的操作。如果您愿意,可以声明一个新方法来实现您想要的功能,然后使用引用。您不能使用伸缩方法引用,好吧,在这种情况下,正如ole-v-v建议的那样,我最好创建一个方法并从那里处理所有这些。好的,在这种情况下,正如ole-v-v所建议的,我最好创建一个方法并从那里处理所有这些。