8

我正在测试来自 Java AKA 的新主要更新Java 8非常有趣。我正在使用流,特别是我正在使用这个简单的代码。

private void getAvg()
{
    final ArrayList<MyPerson>persons = new ArrayList<>
    (Arrays.asList(new MyPerson("Ringo","Starr"),new MyPerson("John","Lennon"),new MyPerson("Paul","Mccartney"),new MyPerson("George","Harrison")));                
    final OptionalDouble average = persons.stream().filter(p->p.age>=40).mapToInt(p->p.age).average();
    average.ifPresent(System.out::println);        
    return;
}            
private class MyPerson
{
    private final Random random = new Random();
    private final String name,lastName;
    private int age;
    public MyPerson(String name,String lastName){this.name = name;this.lastName = lastName;this.age=random.nextInt(100);}    
    public MyPerson(String name,String lastName,final int age){this(name,lastName);this.age=age;}    
    public String getName(){return name;}
    public String getLastName(){return lastName;}                   
    public int getAge(){return age;}        
}            

在这个例子中我理解得很清楚,但后来我看到也可以通过这种方式完成它。

final OptionalDouble average = persons.stream().filter(p->p.age>=40)
.mapToInt(MyPerson::getAge).average();
average.ifPresent(System.out::println);        

我已经检查了toIntFunction方法 ,实际上具有以下签名。

@FunctionalInterface
public interface ToIntFunction<T> {

/**
 * Applies this function to the given argument.
 *
 * @param value the function argument
 * @return the function result
 */
int applyAsInt(T value);
}

我可以看到 applyAsInt 有一个输入并返回一个 int 只要我理解

这段代码

MyPerson::getAge

来电

public int getAge(){return age;}//please correct me at this point        

我的问题是.. 该方法getAge没有参数并返回一个inttoIntFunction接收一个参数这是我不明白的部分。

参数 fromtoIntFunction是推断的或其他的

任何帮助都非常感谢..

多谢

4

2 回答 2

10

请记住,方法引用只是 lambda 的快捷方式。因此,实例方法引用是在参数上调用该方法的 lambda。参数的类型是方法引用中给出的类。它有助于“解开”它。

MyPerson::getAge

展开为 lambda:

(MyPerson p) -> p.getAge()

展开到匿名类:

new ToIntFunction<MyPerson>() {
    @Override
    public int applyAsInt(MyPerson p) {
        return p.getAge();
    }
}

对于静态方法引用,签名必须完全匹配,即静态方法接受 aT并返回 a int。对于实例方法引用,Tlambda 的参数是调用该方法的对象。

于 2014-03-17T00:16:12.027 回答
2

据我所知MyPerson::getAge,它就像一个指向MyPersons getAge() 方法的指针,它返回一个int. 所以value.getAge()int applyAsInt(MyPerson value);. 换句话说:您只需告诉流,它应该使用当前迭代变量getAge()的 s 返回值来构造另一个集合IntStream 。MyPerson

于 2014-03-17T00:07:58.590 回答