2016-03-07 54 views
-2

我想隱式地將我自己的接口實現轉換爲Java8函數。功能接口的隱式轉換

我的代碼:

import java.util.stream.Stream; 

@FunctionalInterface 
interface StringChanger { 
    String change(String o); 
} 

public class A { 

    public static void main(String[] args) { 
     Stream.of("hello", "world") 
       .map(new StringChanger() { 

        @Override 
        public String change(String o) { 
         return o.trim(); 
        } 
       }) 
       .forEach(System.out::println); 
    } 
} 

爲什麼投不工作?

我得到這個異常:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments (Trimmer) 

    at A.main(A.java:13) 
+0

*「我自己的接口實現」*沒有意義。一個接口本質上不是一個實現。你爲什麼要'StringChanger'而不是'UnaryOperator ',爲什麼這很重要? – Tunaki

+1

哇,你完全改變了這個問題,使所有當前的答案無效。這並不酷,我認爲它應該被回滾。因爲這個原因,梅納和成波希甚至不得不刪除他們的答案,所以他們從字面上失去了嘗試幫助你的時間! – Tunaki

+0

同行的壓力讓我回復了我對這個(通常是低估的)問題的改變。更新後的版本將移至http://stackoverflow.com/q/35866449/476791。 @Tunaki – slartidan

回答

0

好了,map方法不指望StringChanger實現。它期望執行一個Function

你可以做的是創建StringChanger接口的實現,並通過你實現的方法參照map

StringChanger sc = new StringChanger() { 
    @Override 
    public String change(String o) { 
     return o.trim(); 
    } 
}; 
Stream.of("hello", "world") 
     .map(sc::change) 
     .forEach(System.out::println); 

編輯:

爲了分配一個功能的實現接口到不同的功能接口參考,您可以指定源功能接口方法的方法參考:

MyConsumer i3 = i::accept; 
    IntConsumer i4 = i2::doSomething; 
+0

@slartidan鑄造是不可能的,因爲這些功能接口不屬於相同的類型層次結構。如果'MyConsumer'是'IntConsumer'的子接口,則可以將'MyConsumer'實例轉換爲'IntConsumer'。 – Eran