Java Academy · Oppitunti

Kuvaus olio- ja primitiivivirtojen välillä

mapToObj ja mapToInt.

Oppitunti 3/413 vaihetta

Kuvaus olio- ja primitiivivirtojen välillä on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi virtojen maailmaa

Javassa on oliovirtoja (Stream<T>) ja primitiivivirtoja (IntStream ja muut vastaavat). Kuvausmetodien avulla niiden välillä voi siirtyä.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        System.out.println(IntStream.rangeClosed(1, 3).sum());
    }
}

mapToObj: primitiivistä olioksi

mapToObj muuntaa jokaisen primitiivin olioksi ja tuottaa Stream<T>-virran.

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<String> labels = IntStream.rangeClosed(1, 3)
            .mapToObj(n -> "item-" + n)
            .collect(Collectors.toList());
        System.out.println(labels);
    }
}

mapToInt: oliosta primitiiviksi

mapToInt poimii jokaisesta oliosta int-arvon ja tuottaa IntStream-virran, joka sopii numeeriseen aggregointiin.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("hi", "hello", "hey");
        int totalChars = words.stream()
            .mapToInt(String::length)
            .sum();
        System.out.println(totalChars);
    }
}

boxed: primitiivistä kääreoliovirtaan

boxed muuntaa IntStream-virran Stream<Integer>-virraksi, jota tarvitaan ennen keräämistä List-kokoelmaan.

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = IntStream.rangeClosed(1, 5)
            .boxed()
            .collect(Collectors.toList());
        System.out.println(list);
    }
}

mapToLong ja mapToDouble

Sama toimintamalli koskee muitakin primitiivejä: mapToLong ja mapToDouble.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> prices = List.of("9.99", "19.50", "4.25");
        double total = prices.stream()
            .mapToDouble(Double::parseDouble)
            .sum();
        System.out.println(total);
    }
}

Miksi mapToInt on map-metodia parempi

map-metodin käyttäminen oliovirrassa pitää arvot pakattuina. mapToInt mahdollistaa numeeriset metodit, kuten sum ja average, ja välttää samalla boxingin.

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> nums = List.of(10, 20, 30);
        double avg = nums.stream()
            .mapToInt(Integer::intValue)
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

Edestakainen muunnos: oliosta IntStreamiin ja takaisin olioksi

Voitte siirtyä molempiin suuntiin samassa putkessa: poimikaa luvut, muuntakaa niitä ja muuntakaa ne sitten takaisin olioiksi.

import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> words = List.of("a", "bb", "ccc");
        List<String> report = words.stream()
            .mapToInt(String::length)
            .mapToObj(len -> "len=" + len)
            .collect(Collectors.toList());
        System.out.println(report);
    }
}

asLongStream ja asDoubleStream

Primitiivivirtojen sisällä tyyppejä voidaan laajentaa: asLongStream ja asDoubleStream välttävät boxingin samalla, kun numeerinen tyyppi vaihtuu leveämmäksi.

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        double avg = IntStream.of(1, 2, 3, 4)
            .asDoubleStream()
            .average()
            .getAsDouble();
        System.out.println(avg);
    }
}

Primitiivitulosten kokoaminen

Kootaksenne primitiivit kokoelmaan kutsukaa ensin boxed-metodia ja sen jälkeen kerääjää.

import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        Set<Integer> evens = IntStream.rangeClosed(1, 10)
            .filter(n -> n % 2 == 0)
            .boxed()
            .collect(Collectors.toSet());
        System.out.println(evens);
    }
}

flatMapToInt

flatMapToInt litistää oliot yhdeksi IntStream-virraksi. Se on hyödyllinen, kun jokainen olio tuottaa useita lukuja.

import java.util.List;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        List<int[]> rows = List.of(new int[]{1, 2}, new int[]{3, 4});
        int sum = rows.stream()
            .flatMapToInt(Arrays::stream)
            .sum();
        System.out.println(sum);
    }
}

Oikean muunnosmetodin valitseminen

Valitkaa metodi suunnan perusteella:

  • Oliosta primitiiviksi: mapToInt, mapToLong tai mapToDouble.
  • Primitiivistä olioksi: mapToObj tai boxed.
import java.util.List;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> in = List.of("x", "yy");
        String out = in.stream()
            .mapToInt(String::length)
            .mapToObj(Integer::toString)
            .collect(Collectors.joining(","));
        System.out.println(out);
    }
}

Pikatarkistus

Mikä metodi muuntaa IntStream-virran Stream<Integer>-virraksi?

Kertaus

Siirryitte olio- ja primitiivivirtojen välillä:

  • mapToInt/mapToLong/mapToDouble muuntavat oliosta primitiiviksi.
  • mapToObj ja boxed muuntavat primitiivistä olioksi.
  • flatMapToInt litistää useita lukuja yhdeksi IntStreamiksi.
  • Primitiivivirtoihin siirtyminen mahdollistaa numeeriset aggregoinnit ilman boxingia.
Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Kuvaus olio- ja primitiivivirtojen välillä” ilmainen?

Kyllä – oppitunnin ”Kuvaus olio- ja primitiivivirtojen välillä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Kuvaus olio- ja primitiivivirtojen välillä”?

mapToObj ja mapToInt. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Kuvaus olio- ja primitiivivirtojen välillä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. IntStream ja LongStream
  2. Väli- ja koontioperaatiot
  3. Kuvaus olio- ja primitiivivirtojen välillä
  4. Primitiivivirtojen luonti
← Takaisin: Java Academy