search
HomeJavajavaTutorialItem Give preference to functions without side effects in streams

Item  Dê preferência às funções sem efeitos colaterais nas streams

Introduction to using streams:

  • New users may find it difficult to express calculations in stream pipelines.
  • Streams are based on functional programming, offering expressiveness, speed and parallelization.

Structuring of the calculation:

  • Structure calculations as sequences of transformations using pure functions.
  • Pure functions depend only on their inputs and do not change state.

Side effects:

  • Avoid side effects in functions passed to stream operations.
  • Improper use of forEach that changes external state is a "bad smell".

Example 1: Code with side effects

Map<string long> freq = new HashMap();
try (Stream<string> words = new Scanner(file).tokens()) {
    words.forEach(word -> {
        freq.merge(word.toLowerCase(), 1L, Long::sum);
    });
}

</string></string>

Problem: This code uses forEach to modify the external state (freq). It is iterative and does not take advantage of streams.

Example 2: Code without side effects

Map<string long> freq;
try (Stream<string> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
}

</string></string>

Solution: Uses the Collectors.groupingBy collector to create the frequency table without changing the external state. Shorter, clearer and more efficient.

Appropriation of the streams API:

  • Code that imitates iterative loops does not take advantage of streams.
  • Use collectors for more efficient and readable operations.

Collectors:

  • Simplify collecting results into collections such as lists and sets.
  • Collectors.toList(), Collectors.toSet(), Collectors.toCollection(collectionFactory).

Example 3: Extracting a list of the ten most frequent words

List<string> topTen = freq.entrySet().stream()
    .sorted(Map.Entry.<string long>comparingByValue().reversed())
    .limit(10)
    .map(Map.Entry::getKey)
    .collect(Collectors.toList());

</string></string>

Explanation:

  • Orders the frequency map entries in descending order of value.
  • Limits the stream to 10 words.
  • Collects the most frequent words in a list.

Complexity of the Collectors API:

  • API has 39 methods, but many are for advanced use.
  • Collectors can be used to create maps (toMap, groupingBy).

Maps and collection strategies:

  • toMap(keyMapper, valueMapper) for unique key-values.
  • Strategies for dealing with key conflicts using the merge function.
  • groupingBy to group elements into categories based on classifier functions.

Example 4: Using toMap with merge function

Map<string long> freq;
try (Stream<string> words = new Scanner(file).tokens()) {
    freq = words.collect(Collectors.toMap(
        String::toLowerCase, 
        word -> 1L, 
        Long::sum
    ));
}

</string></string>

Explanation:

  • toMap maps words to their frequencies.
  • Merge function (Long::sum) deals with key conflicts by summing the frequencies.

Example 5: Grouping albums by artist and finding the best-selling album

Map<artist album> topAlbums = albums.stream()
    .collect(Collectors.toMap(
        Album::getArtist,
        Function.identity(),
        BinaryOperator.maxBy(Comparator.comparing(Album::sales))
    ));

</artist>

Explanation:

  • toMap maps artists to their best-selling albums.
  • BinaryOperator.maxBy determines the best-selling album for each artist.

String Collection:
Collectors.joining to concatenate strings with optional delimiters.

Example 6: Concatenating strings with delimiter

String result = Stream.of("came", "saw", "conquered")
    .collect(Collectors.joining(", ", "[", "]"));

Explanation:

  • Collectors.joining concatenates strings with a comma as delimiter, prefix and suffix.
  • Result: [came, saw, conquered].

Conclusion:

  • Essence of streams is in functions without side effects.
  • forEach should only be used to report results.
  • Knowledge about collectors is essential for effective use of streams.

The above is the detailed content of Item Give preference to functions without side effects in streams. For more information, please follow other related articles on the PHP Chinese website!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Top 4 JavaScript Frameworks in 2025: React, Angular, Vue, SvelteTop 4 JavaScript Frameworks in 2025: React, Angular, Vue, SvelteMar 07, 2025 pm 06:09 PM

This article analyzes the top four JavaScript frameworks (React, Angular, Vue, Svelte) in 2025, comparing their performance, scalability, and future prospects. While all remain dominant due to strong communities and ecosystems, their relative popul

Spring Boot SnakeYAML 2.0 CVE-2022-1471 Issue FixedSpring Boot SnakeYAML 2.0 CVE-2022-1471 Issue FixedMar 07, 2025 pm 05:52 PM

This article addresses the CVE-2022-1471 vulnerability in SnakeYAML, a critical flaw allowing remote code execution. It details how upgrading Spring Boot applications to SnakeYAML 1.33 or later mitigates this risk, emphasizing that dependency updat

How does Java's classloading mechanism work, including different classloaders and their delegation models?How does Java's classloading mechanism work, including different classloaders and their delegation models?Mar 17, 2025 pm 05:35 PM

Java's classloading involves loading, linking, and initializing classes using a hierarchical system with Bootstrap, Extension, and Application classloaders. The parent delegation model ensures core classes are loaded first, affecting custom class loa

How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache?How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache?Mar 17, 2025 pm 05:44 PM

The article discusses implementing multi-level caching in Java using Caffeine and Guava Cache to enhance application performance. It covers setup, integration, and performance benefits, along with configuration and eviction policy management best pra

Node.js 20: Key Performance Boosts and New FeaturesNode.js 20: Key Performance Boosts and New FeaturesMar 07, 2025 pm 06:12 PM

Node.js 20 significantly enhances performance via V8 engine improvements, notably faster garbage collection and I/O. New features include better WebAssembly support and refined debugging tools, boosting developer productivity and application speed.

Iceberg: The Future of Data Lake TablesIceberg: The Future of Data Lake TablesMar 07, 2025 pm 06:31 PM

Iceberg, an open table format for large analytical datasets, improves data lake performance and scalability. It addresses limitations of Parquet/ORC through internal metadata management, enabling efficient schema evolution, time travel, concurrent w

How to Share Data Between Steps in CucumberHow to Share Data Between Steps in CucumberMar 07, 2025 pm 05:55 PM

This article explores methods for sharing data between Cucumber steps, comparing scenario context, global variables, argument passing, and data structures. It emphasizes best practices for maintainability, including concise context use, descriptive

How can I implement functional programming techniques in Java?How can I implement functional programming techniques in Java?Mar 11, 2025 pm 05:51 PM

This article explores integrating functional programming into Java using lambda expressions, Streams API, method references, and Optional. It highlights benefits like improved code readability and maintainability through conciseness and immutability

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

Atom editor mac version download

Atom editor mac version download

The most popular open source editor