2014-05-14 1 views
7

Gibt es eine vordefinierte Funktion in Java 8, das so etwas wie dies funktioniert:Java 8 Funktion, die immer den gleichen Wert zurück, ohne Parameter in Bezug auf

static <T, R> Function<T, R> constant(R val) { 
    return (T t) -> { 
     return val; 
    }; 
} 

Um Menschen Abfrage zu beantworten, warum ich brauche diese Funktion hier das ist Alltag, wenn ich eine ganze Zahl zu einer römischen Zahlen zu analysieren versuchen:

// returns the stream of roman numeral symbol based 
// on the digit (n) and the exponent (of 10) 
private static Stream<Symbol> parseDigit(int n, int exp) { 
    if (n < 1) return Stream.empty(); 
    Symbol base = Symbol.base(exp); 
    if (n < 4) { 
     return IntStream.range(0, n).mapToObj(i -> base); 
    } else if (n == 4) { 
     return Stream.of(base, Symbol.fifth(exp)); 
    } else if (n < 9) { 
     return Stream.concat(Stream.of(Symbol.fifth(exp)), 
      IntStream.range(5, n).mapToObj(i -> base)); 
    } else { // n == 9 as n always < 10 
     return Stream.of(base, Symbol.base(exp + 1)); 
    } 
} 

Und ich denke, das IntStream.range(0, n).mapToObj(i -> base) so etwas wie Stream.of(base).times(n - 1) vereinfacht werden könnte, leider gibt es keine times(int) Methode auf Stream-Objekt. Weiß jemand, wie man es macht?

+3

Können Sie ein Beispiel geben, wo eine Funktion wie _constant_ nützlich wäre? – nosid

+0

Interessiert auch an einem Anwendungsfall. So weit ich sehen kann, wäre 'x -> 5 'mehr oder weniger äquivalent zu' constant (5) ', aber ich habe das Gefühl, dass ich etwas verpasst habe :) –

+0

x -> 5 ist genau das was ich suche ! Kannst du es in die Antwort einfügen? –

Antwort

10

Ein einfacher Lambda, x -> val scheint Ihrer Methode zu entsprechen;

Function<Integer, Integer> test1 = constant(5); 
Function<Integer, Integer> test2 = x -> 5; 

... beide ignorieren die Eingabe und geben die Konstante 5 aus, wenn sie angewendet wird;

> System.out.println(test1.apply(2)); 
5 
> System.out.println(test2.apply(2)); 
5 
Verwandte Themen