Java 8 mapToInt和toIntFunction示例

时间:2014-03-16 23:51:58

标签: java java-8 java-stream

我正在测试Java的新主要更新A.K.A 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没有参数并返回 int 但是 toIntFunction 接收参数这是我不理解的部分。

推断出来自toIntFunction的参数或其他内容

任何帮助都非常感谢..

非常感谢

2 个答案:

答案 0 :(得分:9)

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

MyPerson::getAge

打开lambda:

(MyPerson p) -> p.getAge()

打开一个匿名类:

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

使用静态方法引用时,签名必须完全匹配,即静态方法需要T并返回int。使用实例方法引用,lambda的参数T是调用方法的对象。

答案 1 :(得分:2)

至于我知道MyPerson::getAge就像是指向MyPerson的getAge()方法的指针,该方法返回int。因此value.getAge()会调用int applyAsInt(MyPerson value);。 换句话说:您只需告诉流,它应该使用getAge()从其当前MyPerson迭代变量的返回值来构造另一个集合和{{ 3}}