Avatar billede bvirk Guru
21. december 2016 - 14:48 Der er 1 kommentar og
1 løsning

er function det nye ord for function object i java 8

Læsende her:

https://dzone.com/articles/functional-programming-java-8

ser jeg at add1, der er defineret sådan:

Function<Integer,Integer> add1 = x -> x + 1;

kaldes en funktion. I min verden er det object ligesom i:

'classname whatever' varname=....;

Et object, her, instantieret fra Function, med method: R apply(T t)

Fra api'et:
public interface Function<T,R>
Represents a function that accepts one argument and produces a result.
This is a functional interface whose functional method is apply(Object).

'functional method'? ikke engang 'Functional method' (med stort F) - skal man helt forståelsesmæssigt droppe ordet function som synonym for method i klassisk OO forståelse

Er det rigtige forstået at ordet function i java 8 sammenhænge nu er et synonym for function object (lige som mobil er en mobiltelefon).

Eller med andre ord: function betyder ikke function men instans af Function.
Avatar billede arne_v Ekspert
21. december 2016 - 19:37 #1
Terminologi kan vaere tricky.

Lad os foerst se paa den officielle terminology.

JLS taler om:

functional interface
lambda expression

Saa dit eksempel vil vel vaere:

assign reference to lambda expression to a reference of a type of functional interface X

JLS bruger slet ikke termen function.

(men hvis du er interesseret i den finere terminologi saa bruges der side op og side ned paa functional interface vs functional type)

Java API har saa et functional interface:

@FunctionalInterface
public interface Function<T,R>

for convenience.

Og ordlyden er ret nornal Java.

java.util.function.Function
Represents a function that ...

java.lang.String
The String class represents character strings

Dokumentationen for en type forklarer hvad type bruges til aka hvad en instans af type refererer til. Med en beskrivelse som er standard engelsk.

Og nu er det vi begynder at forlade Java terminologi og bevaege os over i generel programmerings terminologi og standard engelsk.

Jeg kan ihvertfald se to mulige forklaringer paa ordvalget i den dzone artikel:
1) invoke these functions = kort form af kald den logiske funktion som er implementeret i lambda expression og som refereres af refrence af typen Function<>
2) generel manglende forstaaelse for forskellen mellem type, reference, instans og koncept

Kvaliteten paa dzone er ofte ret lav, saa det kunne sagtens vaere #2.

Men udfra det efterfoelgende:


And how can we invoke these functions?

Well, now that they are bound to a reference we can treat them pretty much like we treat any object:


saa lyder det nu som om at forfatteren godt ved hvordan tingene haenger sammen.

Formaalet med at skrive noget maa vaere at laeseren forstaar hvad man mener og udfra det saa vil jeg sige at:

* functional interface er en god term - ingen tvivl om betydning
* lamda expression er en god term - ingen tvivl om betydning
* function object er en acceptabel term - alle enten ved hvad det er eller vil gaette rigtigt
* function er en daarlig term som boer undgaas - medmindre konteksten er meget klar vil ingen vide om der menes:
- synonym for metode
- functional interface type
- function reference/object
- Function<> reference/object
Avatar billede bvirk Guru
01. januar 2017 - 14:19 #2
Hej Arne
Tak uddybende for svar.
Måtte lige google JLS - erindere så at jeg før java 5 har været der før. Jeg kan lide sproget så det noteret som god kilde til information.
Har ingen nutidig træning i java - vil blot beriges om hvordan de features der kendes fra javascript arrays functions (map,filter,reduce ...) er implementeret i java.

Var trods alt beriget af dzone artiklen - det er jo en almen udfording for uvidende at eksperter uden blusel bruger samme ord i underforstået kontekst.
Synes også - når man prøver at læse her og der på nettet, at der vises alt det som man opnå med lambda udtryk, men ikke, helt enkelt, hvad lamdba udtryk er.
Der gik lang tid før jeg så "atomet":
"en lamda er implementation af en interface method"

*/
public class LambdaWays {
    public static void main(String [] args) {
        IMyString constObj = () -> "less DRYable ";
        IMyFunc<String,String> funcObj = s -> s + " world";
        IMyvoid<String> borrowedMethod = System.out::println;
        borrowedMethod.myM(funcObj.myM(constObj.myM()));
    }
}

interface IMyFunc<A, R> {
    R myM(A arg);
}

interface IMyvoid<A> {
    void myM(A arg);
}

interface IMyString {
    String myM();
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester