-
Notifications
You must be signed in to change notification settings - Fork 0
/
lambda-ausdruecke-2.html
18 lines (17 loc) · 10.2 KB
/
lambda-ausdruecke-2.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html><html lang="de-ch"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Lambda-Ausdrücke Teil 2 - Finecloud</title><meta name="description" content="Im ersten Teil zum Thema Lambda-Ausdrücke haben wir gelernt was Lambda-Ausdrücke sind und wie man diese verwenden kann. Im zweiten Teil schauen wir nun hinter die Kulissen, wie Lambda-Ausdrücke funktionieren. Zentral zum Verständnis, wie Lambda-Ausdrücke in Java funktionieren, ist der Begriff des funktionalen Interface. Das…"><meta name="generator" content="Publii Open-Source CMS for Static Site"><link rel="stylesheet" href="https://www.finecloud.ch/media/plugins/syntaxHighlighter/prism-black.css"><link rel="canonical" href="https://www.finecloud.ch/lambda-ausdruecke-2.html"><link rel="alternate" type="application/atom+xml" href="https://www.finecloud.ch/feed.xml"><link rel="alternate" type="application/json" href="https://www.finecloud.ch/feed.json"><meta property="og:title" content="Lambda-Ausdrücke Teil 2"><meta property="og:site_name" content="Finecloud"><meta property="og:description" content="Im ersten Teil zum Thema Lambda-Ausdrücke haben wir gelernt was Lambda-Ausdrücke sind und wie man diese verwenden kann. Im zweiten Teil schauen wir nun hinter die Kulissen, wie Lambda-Ausdrücke funktionieren. Zentral zum Verständnis, wie Lambda-Ausdrücke in Java funktionieren, ist der Begriff des funktionalen Interface. Das…"><meta property="og:url" content="https://www.finecloud.ch/lambda-ausdruecke-2.html"><meta property="og:type" content="article"><link rel="shortcut icon" href="https://www.finecloud.ch/media/website/finecloud.png" type="image/png"><link rel="stylesheet" href="https://www.finecloud.ch/assets/css/style.css?v=39da73365516a098a9b73b721fc970e2"><script type="application/ld+json">{"@context":"http://schema.org","@type":"Article","mainEntityOfPage":{"@type":"WebPage","@id":"https://www.finecloud.ch/lambda-ausdruecke-2.html"},"headline":"Lambda-Ausdrücke Teil 2","datePublished":"2022-05-29T15:35","dateModified":"2022-06-20T07:13","description":"Im ersten Teil zum Thema Lambda-Ausdrücke haben wir gelernt was Lambda-Ausdrücke sind und wie man diese verwenden kann. Im zweiten Teil schauen wir nun hinter die Kulissen, wie Lambda-Ausdrücke funktionieren. Zentral zum Verständnis, wie Lambda-Ausdrücke in Java funktionieren, ist der Begriff des funktionalen Interface. Das…","author":{"@type":"Person","name":"Finecloud","url":"https://www.finecloud.ch/authors/finecloud/"},"publisher":{"@type":"Organization","name":"Finecloud"}}</script><meta name="google-site-verification" content="seFY9U12uiEq5U3_MyZiX6XWzk0AVFl9zITr2ZKsytY"></head><body><div class="site-container"><header class="top" id="js-header"><a class="logo" href="https://www.finecloud.ch/">Finecloud</a><nav class="navbar js-navbar"><button class="navbar__toggle js-toggle" aria-label="Menu" aria-haspopup="true" aria-expanded="false"><span class="navbar__toggle-box"><span class="navbar__toggle-inner">Menu</span></span></button><ul class="navbar__menu"><li><a href="https://www.finecloud.ch/" target="_self">Blog</a></li><li><a href="https://www.finecloud.ch/tags/" target="_self">Tags</a></li></ul></nav><div class="search"><div class="search__overlay js-search-overlay"><div class="search__overlay-inner"><form action="https://www.finecloud.ch/search.html" class="search__form"><input class="search__input js-search-input" type="search" name="q" placeholder="search..." aria-label="search..." autofocus="autofocus"></form><button class="search__close js-search-close" aria-label="Close">Close</button></div></div><button class="search__btn js-search-btn" aria-label="Search"><svg role="presentation" focusable="false"><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#search"/></svg></button></div></header><main><article class="post"><div class="hero"><figure class="hero__image hero__image--overlay"><img src="https://www.finecloud.ch/media/website/download.jpg" srcset="https://www.finecloud.ch/media/website/responsive/download-xs.jpg 300w, https://www.finecloud.ch/media/website/responsive/download-sm.jpg 480w, https://www.finecloud.ch/media/website/responsive/download-md.jpg 768w, https://www.finecloud.ch/media/website/responsive/download-lg.jpg 1024w, https://www.finecloud.ch/media/website/responsive/download-xl.jpg 1360w, https://www.finecloud.ch/media/website/responsive/download-2xl.jpg 1600w" sizes="100vw" loading="eager" alt=""></figure><header class="hero__content"><div class="wrapper"><div class="post__meta"><time datetime="2022-05-29T15:35">Mai 29, 2022</time></div><h1>Lambda-Ausdrücke Teil 2</h1></div></header></div><div class="wrapper post__entry"><div class="post__toc"><h3>Table of Contents</h3><ul><li><a href="#mcetoc_1g4tdue1l5po">Closures</a></li></ul></div><p>Im ersten Teil zum Thema Lambda-Ausdrücke haben wir gelernt was Lambda-Ausdrücke sind und wie man diese verwenden kann. Im zweiten Teil schauen wir nun hinter die Kulissen, wie Lambda-Ausdrücke funktionieren.</p><p>Zentral zum Verständnis, wie Lambda-Ausdrücke in Java funktionieren, ist der Begriff des <em>funktionalen Interface</em>. Das ist ein Interface, das nur eine Methode definiert. Das war bereits vor der Lambda Einführung eine übliche Möglichkeit, in Java Funktionalität als Parameter zu übergeben.</p><p><code>Arrays.sort(einArray, new Comparator(){</code><br><code> public int compareTo(Object o1, Object o2){…}</code><br><code>});</code></p><p>Comparator ist ein funktionales Interface, es deklariert nur die Methode compareTo. Aber ein Lambda-Ausdruck kann überall dort, wo ein funktionales Interface als Parametertyp angeben wird eingesetzt werden. Das heisst auch als Comparator:</p><p><code>Arrays.sort(songs, (song1, song2) -> </code><br><code> song1.getLaengeInSekunden() - song2.getLaengeInSekunden())</code></p><p>Das funktioniert mit allen funktionalen Interfaces, auch eigene. Wenn Sie ein Interface deklarieren, das nur eine Methode enthält, dann können Sie, um dieses Interface zu implementieren, auch Lambda-Ausdrücke verwenden.</p><h3 id="mcetoc_1g4tdue1l5po">Closures</h3><p>Oft wird für Lambda-Ausdrücke auch der Begriff Closure verwendet. Die beiden gehören untrennbar zusammen, sind aber nicht dasselbe.</p><p>Ein Lambda-Ausdruck ist definiert als eine anonyme Funktion. Er erfüllt dieselbe Aufgabe wie eine Methode, hat aber keinen Namen.</p><p>Ein Closure hingegen ist ein Bündel aus einer Funktion und der Umgebung, aus der heraus diese Funktion aufgerufen wurde. Mit Umgebung sind hier die lokalen Variablen gemeint welche zum Zeitpunkt des Aufrufs im Scope liegen. Das beim Erzeugen der anonymen Objektinstanz oder der Lambda-Instanz eine Closure gebildet wird, erlaubt es, auf die Werte der lokalen Variablen auch dann noch zuzugreifen, wenn sie schon nicht mehr im Scope liegen:</p><p><code>public static void main(String[] args) throws Exception {</code><br><code> IntSupplier test = erzeugeClosure();</code><br><code> new Thread(() -> System.out.println(test.getAsInt())).start();</code><br><code>}</code><br><code>public static IntSupplier erzeugeClosure() {</code><br><code> int wert = 123;</code><br><code> return (() -> wert);</code><br><code>}</code></p><p>Die Funktion <em>erzeugeClosure</em> gibt eine Instanz des funktionalen Interface <em>IntSupplier</em> zurück, die als Lambda angegeben ist. Die <em>main</em>-Methode führt diese zurückgegebene Instanz in einem neuen Thread aus, indem sie ihre <em>getAsInt</em>-Methode ruft. Obwohl der Wert dieser Variable zu diesem Zeitpunkt nicht mehr im Scope liegt, kommt es zur Ausgabe "123". Das ist möglich, weil die Variable in der Closure, die für den Lambda-Ausdruck erzeugt wird, noch vorhanden ist. <strong>Der Lambda-Ausdruck ist das, was Sie in Ihrem Code niederschreiben. Erst zur Laufzeit wird daraus und aus der Ausführungsumgebung eine Closure.</strong></p><p> </p></div><footer class="wrapper post__footer"><p class="post__last-updated">This article was updated on Juni 20, 2022</p><ul class="post__tag"><li><a href="https://www.finecloud.ch/tags/java/">java</a></li><li><a href="https://www.finecloud.ch/tags/lambda/">lambda</a></li><li><a href="https://www.finecloud.ch/tags/softwareentwicklung/">software development</a></li></ul><div class="post__share"></div></footer></article><div class="post__related related"><div class="wrapper"><h2 class="h5 related__title">You should also read:</h2><article class="related__item"><div class="feed__meta"><time datetime="2022-07-02T17:34" class="feed__date">Juli 2, 2022</time></div><h3 class="h1"><a href="https://www.finecloud.ch/kubernetes-auf-proxmox-mit-ansible-und-terraform-teil-2.html">Kubernetes auf Proxmox mit Ansible und Terraform (Teil 2)</a></h3></article><article class="related__item"><div class="feed__meta"><time datetime="2022-07-01T18:59" class="feed__date">Juli 1, 2022</time></div><h3 class="h1"><a href="https://www.finecloud.ch/kubernetes-auf-proxmox-mit-ansible-und-terraform.html">Kubernetes auf Proxmox mit Ansible und Terraform (Teil 1)</a></h3></article></div></div></main><footer class="footer"><div class="footer__copyright"><p>Powered by Publii</p></div><button onclick="backToTopFunction()" id="backToTop" class="footer__bttop" aria-label="Back to top" title="Back to top"><svg><use xlink:href="https://www.finecloud.ch/assets/svg/svg-map.svg#toparrow"/></svg></button></footer></div><script>window.publiiThemeMenuConfig = {
mobileMenuMode: 'sidebar',
animationSpeed: 300,
submenuWidth: 'auto',
doubleClickTime: 500,
mobileMenuExpandableSubmenus: true,
relatedContainerForOverlayMenuSelector: '.top',
};</script><script defer="defer" src="https://www.finecloud.ch/assets/js/scripts.min.js?v=6ca8b60e6534a3888de1205e82df8528"></script><script>var images = document.querySelectorAll('img[loading]');
for (var i = 0; i < images.length; i++) {
if (images[i].complete) {
images[i].classList.add('is-loaded');
} else {
images[i].addEventListener('load', function () {
this.classList.add('is-loaded');
}, false);
}
}</script><script defer="defer" src="https://www.finecloud.ch/media/plugins/syntaxHighlighter/prism.js"></script></body></html>