2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Java 8 sisältää monia uusia ominaisuuksia, joista merkittävimmät ovat Lambda-lausekkeet ja Stream API. Stream API tarjoaa tehokkaan ja tiiviin menetelmän keräystietojen käsittelyyn, mikä tekee koodista tiiviimmän ja selkeämmän, ja sillä on hyvä luettavuus ja ylläpidettävyys. Tässä artikkelissa käsitellään Java Stream API:n käyttöä, mukaan lukien peruskäsitteet, yleiset toiminnot, rinnakkaiskäsittely, käytännön tapaukset ja parhaat käytännöt.
Stream API on Java 8:ssa käyttöön otettu abstraktio kokoelmatietojen käsittelyyn, joka mahdollistaa tietojen käsittelyn deklaratiivisella tavalla (samanlailla kuin SQL-käskyt). Stream API tarjoaa monia tehokkaita toimintoja, joita voidaan käyttää kokoelmien suodattamiseen, lajitteluun, kartoittamiseen, vähentämiseen ja muihin toimiin, mikä yksinkertaistaa koodia huomattavasti.
Stream-sovellusliittymä tarjoaa useita tapoja luoda Stream. Yleisiä ovat seuraavat:
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream.of
:Stream<String> stream = Stream.of("a", "b", "c");
Stream.generate
:Stream<Double> stream = Stream.generate(Math::random).limit(10);
Stream.iterate
:Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);
Välioperaatioita käytetään Streamin muuntamiseen, ja ne arvioidaan laiskasti Yleisiä välitoimintoja ovat seuraavat:
filter
: käytetään elementtien suodattamiseen.Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
map
: Käytetään yhdistämään jokainen elementti vastaavaan tulokseen.Stream<String> stream = list.stream().map(String::toUpperCase);
flatMap
: Käytetään jokaisen elementin muuntamiseen streamiksi ja yhdistämiseen yhdeksi streamiksi.Stream<String> stream = list.stream().flatMap(s -> Stream.of(s.split("")));
distinct
: Käytetään kaksoiskappaleiden poistamiseen.Stream<String> stream = list.stream().distinct();
sorted
: käytetään lajitteluun.Stream<String> stream = list.stream().sorted();
peek
: Käytetään jokaisen elementin tarkasteluun käsittelyn aikana.Stream<String> stream = list.stream().peek(System.out::println);
Päätetoimintoja käytetään virran laskemiseen ja tulosten luomiseen. Yleisiä päätetoimintoja ovat seuraavat:
forEach
: Suorita toimenpide kullekin elementille.list.stream().forEach(System.out::println);
collect
: Muunna Stream muihin muotoihin.List<String> result = list.stream().collect(Collectors.toList());
reduce
: Pienennä streamin elementit arvoksi.Optional<String> result = list.stream().reduce((s1, s2) -> s1 + s2);
toArray
:Muunna stream taulukoksi.String[] array = list.stream().toArray(String[]::new);
count
: Laske elementtien määrä.long count = list.stream().count();
anyMatch
、allMatch
、noneMatch
: Käytetään arvioinnin sovittamiseen.boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("a"));
findFirst
、findAny
: Käytetään elementtien etsimiseen.Optional<String> first = list.stream().findFirst();
Optional<String> any = list.stream().findAny();
käyttääsorted
Menetelmä lajittelee virran ja voi kulkea vertailussa.
List<String> list = Arrays.asList("b", "c", "a");
List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
// 逆序排序
List<String> sortedListDesc = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
käyttääfilter
Streamin elementtien suodatusmenetelmä.
List<String> list = Arrays.asList("a", "b", "c");
List<String> filteredList = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
käyttäämap
Menetelmä kartoittaa streamin elementit.
List<String> list = Arrays.asList("a", "b", "c");
List<String> mappedList = list.stream().map(String::toUpperCase).collect(Collectors.toList());
käyttääreduce
Menetelmä streamin elementtien vähentämiseksi.
List<String> list = Arrays.asList("a", "b", "c");
String result = list.stream().reduce("", (s1, s2) -> s1 + s2);
käyttääcollect
Menetelmät muuntaa Streamin muihin muotoihin.
List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());
Set<String> collectedSet = list.stream().collect(Collectors.toSet());
String joinedString = list.stream().collect(Collectors.joining(","));
Parallel Stream voi hyödyntää täysimääräisesti moniytimisprosessorien edut parantaakseen tietojenkäsittelyn tehokkuutta.voi käyttääparallelStream
Menetelmä luo rinnakkaisen virran.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());
Voidaan myös käyttääparallel
Menetelmä muuntaa normaalin virran rinnakkaiseksi streamiksi.
List<String> list = Arrays.asList("a", "b", "c");
List<String> parallelList = list.stream().parallel().map(String::toUpperCase).collect(Collectors.toList());
On huomattava, että rinnakkainen Stream ei aina ole nopeampi kuin sarjavirta, ja se on testattava tilanteen mukaan.
Suodata merkkijonot, joiden pituus on pienempi kuin 3, ja muunna loput isoiksi kirjaimiksi.
List<String> list = Arrays.asList("a", "ab", "abc", "abcd");
List<String> result = list.stream()
.filter(s -> s.length() >= 3)
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(result); // 输出:[ABC, ABCD]
Kun on annettu joukko kokonaislukuja, laske kaikkien kokonaislukujen keskiarvo.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = list.stream()
.mapToInt(Integer::intValue)
.average();
average.ifPresent(System.out::println); // 输出:3.0
Stream API:n käyttäminen
Lue tiedoston sisältö ja tulosta se konsoliin.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Lue tiedoston sisältö ja laske kunkin sanan esiintymismäärä.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
Map<String, Long> wordCount = lines
.flatMap(line -> Arrays.stream(line.split("\W+")))
.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting()));
wordCount.forEach((word, count) -> System.out.println(word + ": " + count));
} catch (IOException e) {
e.printStackTrace();
}
Oletetaan, että meillä on tietokantataulukkousers
, joka sisältää kenttiäid
、name
jaage
. Voimme käyttää Stream API:ta kyselyn tulosten käsittelyyn.
List<User> users = queryDatabase();
List<String> names = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
System.out.println(names);
Collectors
Luokassa on erilaisia keräilijöitä, joista voit valita sopivan keräilijän tarpeiden mukaan.Kun Stream on käytetty, sitä ei voi käyttää uudelleen. Jos sinun on käytettävä sitä uudelleen, voit harkita Streamin muuntamista kokoelmaksi ennen sen käyttöä.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
stream.forEach(System.out::println);
stream.forEach(System.out::println); // 会抛出IllegalStateException
Rinnakkaisvirrat eivät aina ole nopeampia kuin sarjavirrat, ja ne on testattava tapauskohtaisesti.voi käyttääForkJoinPool
Rinnakkaisvirran optimoimiseksi.
ForkJoinPool customThreadPool = new ForkJoinPool(4);
customThreadPool.submit(() ->
list.parallelStream().forEach(System.out::println)
).get();
Kun käytät Stream APIa suurten tietomäärien käsittelyyn, sinun on kiinnitettävä huomiota muistivuotojen ongelmaan.voi käyttääclose
tapa sulkea Stream tai käyttäätry-with-resources
lauseke sulkee streamin automaattisesti.
try (Stream<String> lines = Files.lines(Paths.get("example.txt"))) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Tässä artikkelissa esitellään yksityiskohtaisesti Java Stream API:n käyttö, mukaan lukien perustoiminnot, lisätoiminnot, rinnakkaiskäsittely, käytännön tapaukset ja parhaat käytännöt. Hyödyntämällä rationaalisesti Stream API:ta kehittäjät voivat yksinkertaistaa koodia huomattavasti, parantaa koodin luettavuutta ja ylläpidettävyyttä sekä parantaa tietojenkäsittelyn tehokkuutta. Toivon, että tästä artikkelista on apua Stream API:n käytössä Java-kehityksessä.
Java Stream API on tehokas työkalu keräystietojen käsittelyyn Eri toimintojen joustavan käytön avulla voidaan saavuttaa tehokas tietojenkäsittely ja suoratoistolaskenta. Jos et ole käyttänyt Stream API:ta, on suositeltavaa oppia ja hallita tämä tehokas työkalu mahdollisimman pian ja soveltaa sitä projektiisi kehitystehokkuuden ja koodin laadun parantamiseksi.