-
Notifications
You must be signed in to change notification settings - Fork 0
/
endlose-streams.html
18 lines (17 loc) · 7.93 KB
/
endlose-streams.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>Endlose Streams - Finecloud</title><meta name="description" content="Nicht jeder Stream ist endlich. Manche Streams erzeugen immer weiter Daten. Solche Streams nennt man auch Generatoren, weil sie ihre Daten selbst herstellen. Dazu gibt es in Stream und den primitiven Streams jeweils zwei statische Methoden, die einen solchen Stream erzeugen. Die generate-Methode arbeiten mit…"><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/endlose-streams.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="Endlose Streams"><meta property="og:site_name" content="Finecloud"><meta property="og:description" content="Nicht jeder Stream ist endlich. Manche Streams erzeugen immer weiter Daten. Solche Streams nennt man auch Generatoren, weil sie ihre Daten selbst herstellen. Dazu gibt es in Stream und den primitiven Streams jeweils zwei statische Methoden, die einen solchen Stream erzeugen. Die generate-Methode arbeiten mit…"><meta property="og:url" content="https://www.finecloud.ch/endlose-streams.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/endlose-streams.html"},"headline":"Endlose Streams","datePublished":"2022-06-02T11:02","dateModified":"2022-06-20T07:10","description":"Nicht jeder Stream ist endlich. Manche Streams erzeugen immer weiter Daten. Solche Streams nennt man auch Generatoren, weil sie ihre Daten selbst herstellen. Dazu gibt es in Stream und den primitiven Streams jeweils zwei statische Methoden, die einen solchen Stream erzeugen. Die generate-Methode arbeiten mit…","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-06-02T11:02">Juni 2, 2022</time></div><h1>Endlose Streams</h1></div></header></div><div class="wrapper post__entry"><p>Nicht jeder Stream ist endlich. Manche Streams erzeugen immer weiter Daten. Solche Streams nennt man auch Generatoren, weil sie ihre Daten selbst herstellen. Dazu gibt es in Stream und den primitiven Streams jeweils zwei statische Methoden, die einen solchen Stream erzeugen.</p><p>Die <em>generate</em>-Methode arbeiten mit einem <em>Supplier</em>. Der so erzeugte Stream enthält nach und nach alle Werte, die dieser Supplier liefert. Ein solcher Stream ist sehr monoton, wenn der übergebene Supplier () -> 1 lautet, aber er ist trotzdem endlos, denn der Supplier wird immer wieder aufgerufen. Zum Glück existieren auch interessantere Supplier.</p><p>Die zweite Möglichkeit, einen endlosen Stream zu erzeugen, heisst <em>iterate</em>. Diese Methode erzeugt einen Stream, indem sie eine übergebene Funktion immer wieder auf einen Standwert anwendet. Für einen Startwert n und eine Funktion f heisst das, der erzeugt Stream enthält die Werte [n, f(n), f(f(n)), f(f(f(n))), …]</p><p><code>Stream.iterate(BigInteger.ONE, i -> i.multiply(two))</code><br><code> .limit(1000)</code><br><code> .forEach(System.out::println);</code></p><p>Das Beispiel erzeugt einen Stream alle Zweierpotenzen und gibt die ersten 1000 davon aus. Es versteht sich von selbst, dass manche Operationen auf einem endlosen Stream keine gute Idee sind. Ihn zu sortieren, führt eher zu Problemen, und auch bei einer forEach ohne limit sollte man sicher sein, was man tut. Für den zweiten Fall gibt es aber durchaus Anwendungen. So könnte man in einem Thread einen endlosen Stream von Ergebnissen erzeugen und jedes gefundene Ergebnis in einem anderen Thread verarbeiten.</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><li><a href="https://www.finecloud.ch/tags/stream-api/">stream-api</a></li></ul><div class="post__share"></div></footer></article></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>