1. 程式人生 > >Java核心技術卷Ⅱ程式清單1-4

Java核心技術卷Ⅱ程式清單1-4

P16-18
程式清單1-4 collecting/CollectingResults.java

  1. 程式碼
  2. 專案結構
  3. 分析
  4. 重要API

1.程式碼

import java.io.*;
import java.nio.charset.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.*;

public class CollectingResults
{
   public static Stream<String> noVowels() throws IOException
   {
   //讀取alice30.txt
檔案中所有內容並賦給contents字串 String contents = new String(Files.readAllBytes( Paths.get("../gutenberg/alice30.txt")), StandardCharsets.UTF_8); //將contents中字串切割成單詞並存入wordList列表 List<String> wordList = Arrays.asList(contents.split("\\PL+")); //建立wordList列表對應的流並賦給words字串流 Stream<String> words = wordList.stream
(); //將words對映為一個“將母音字母全部改為空”的字串流stream並返回 return words.map(s -> s.replaceAll("[aeiouAEIOU]", "")); } public static <T> void show(String label, Set<T> set) { //列印set所屬型別 System.out.print(label + ": " + set.getClass().getName()); //列印set對應流的元素(以逗號分隔) System.out
.println("[" + set.stream().limit(10).map(Object::toString) .collect(Collectors.joining(", ")) + "]"); } public static void main(String[] args) throws IOException { //迭代遍歷流裡前十個元素並列印。從0開始,每次加1 Iterator<Integer> iter = Stream.iterate(0, n -> n + 1).limit(10) .iterator(); while (iter.hasNext()) System.out.println(iter.next()); //迭代流裡前十個元素並賦給object陣列numbers,列印陣列首地址 Object[] numbers = Stream.iterate(0, n -> n + 1).limit(10).toArray(); System.out.println("Object array:" + numbers); // Note it's an Object[] array try { //列印numbers陣列的第一個元素 Integer number = (Integer) numbers[0]; // OK System.out.println("number: " + number); System.out.println("The following statement throws an exception:"); Integer[] numbers2 = (Integer[]) numbers; // Throws exception } catch (ClassCastException ex) { //列印異常資訊 System.out.println(ex); } //迭代並構造流裡前十個元素賦給Integer陣列numbers,列印陣列首地址 Integer[] numbers3 = Stream.iterate(0, n -> n + 1).limit(10) .toArray(Integer[]::new); System.out.println("Integer array: " + numbers3); // Note it's an Integer[] array Set<String> noVowelSet = noVowels() .collect(Collectors.toSet()); show("noVowelSet", noVowelSet); TreeSet<String> noVowelTreeSet = noVowels().collect( Collectors.toCollection(TreeSet::new)); show("noVowelTreeSet", noVowelTreeSet); String result = noVowels().limit(10).collect( Collectors.joining()); System.out.println("Joining: " + result); result = noVowels().limit(10) .collect(Collectors.joining(", ")); System.out.println("Joining with commas: " + result); IntSummaryStatistics summary = noVowels().collect( Collectors.summarizingInt(String::length)); double averageWordLength = summary.getAverage(); double maxWordLength = summary.getMax(); System.out.println("Average word length: " + averageWordLength); System.out.println("Max word length: " + maxWordLength); System.out.println("forEach:"); noVowels().limit(10).forEach(System.out::println); } }

alice30.txt在這裡就不貼出了,讀者可以自己隨意寫個文字文件進行測試。

2.專案結構

這裡寫圖片描述

3.分析

先講一下兩個靜態方法

public static Stream<String> noVowels() throws IOException
   {
      String contents = new String(Files.readAllBytes(
            Paths.get("../gutenberg/alice30.txt")),
            StandardCharsets.UTF_8);
      List<String> wordList = Arrays.asList(contents.split("\\PL+"));
      Stream<String> words = wordList.stream();
      return words.map(s -> s.replaceAll("[aeiouAEIOU]", ""));
   }

noVowels()方法:從alice30.txt中讀取字元內容,分隔為單詞並去除母音字母后返回流Stream<String>
words.map(s -> s.replaceAll("[aeiouAEIOU]", ""))將words中的元素一一對映為新的元素,並整合為新流。[aeiouAEIOU]是正則表示式,匹配母音字母。

public static <T> void show(String label, Set<T> set)
   {
      System.out.print(label + ": " + set.getClass().getName());
      System.out.println("["
            + set.stream().limit(10).map(Object::toString)
                  .collect(Collectors.joining(", ")) + "]");
   }

show(String label, Set<T> set)方法:列印label,列印set中前十個元素(以逗號分隔)。
getClass()getName()利用反射機制,是Object方法。
collect(Collectors.joining(", "))方法:收集流中的元素並以逗號分隔,返回String型別。

回到main函式

以下:

try
      {
         Integer number = (Integer) numbers[0]; // OK
         System.out.println("number: " + number);
         System.out.println("The following statement throws an exception:");
         Integer[] numbers2 = (Integer[]) numbers; // Throws exception
      }
      catch (ClassCastException ex)
      {
         System.out.println(ex);
      }

這裡解釋一下這句程式碼:Integer[] numbers2 = (Integer[]) numbers; // Throws exception
numbers是Object陣列物件,而Object[]並不是Integer[]的父類,因此強制轉型後丟擲ClassCastException型別匹配異常。
main函式其餘部分,請參照重要API佐證理解。

4.重要API

java.util.stream.BaseStream 8

Iterator<T> iterator()
產生一個用於獲取當前流中各個元素的迭代器。這是一種終結操作。

java.util.stream.BaseStream 8

Iterator<T> iterator()
產生一個用於獲取當前流中各個元素的迭代器。這是一種終結操作。

java.util.stream.Stream 8

void forEach(Consumer<? super T>action)
在流的每個元素上呼叫action。這是一種終結操作。

Object[] toArray()
<A>A[] toArray(IntFunction<A[]> generator)
產生一個物件陣列,或者在將引用A[]::new傳遞給構造器時,返回一個A型別的陣列。這些操作都是終結操作。

<R,A> R collect(Collector<? super T,A,R> collector)
使用給定的收集器來收集當前流中的元素。Collectors類有用於多種收集器的工廠方法。

java.util.stream.Collectors 8

static <T> Collector<T,?,List<T>> toList()
static <T> Collector<T,?,Set<T>> toSet()
產生一個將元素收集到列表或集中的收集器。

static <T,C extends Collection<T>> Collector<T,?,C> toCollection(Supplier<C> collectionFactory)
產生一個將元素收集到任何集合中的收集器。可以傳遞一個諸如Treeset::new的構造器引用。

static Collector<CharSequence,?,String> joining()
static Collector<CharSequence,?,String> joining(CharSequence delimiter)
static Collector<CharSequence,?,String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
產生一個連線字串的收集器。分隔符會置於字串之間,而第一個字串之前可以有字首,最後一個字串之後可以有後綴。如果沒有指定,那麼它們都為空。

static <T> Collector<T,?,IntSummaryStatistics> summarizingint(ToIntFunction<?super T>mapper
產生能夠生成(Int|Long|Double)SummaryStatistics物件的收集器,通過它可以獲得將mapper應用於每個元素後所產生的結果的個數、總和、平均值、最大值和最小值。

如有謬誤或不完善之處,懇請斧正。

相關推薦

Java核心技術程式清單1-4

P16-18 程式清單1-4 collecting/CollectingResults.java 程式碼 專案結構 分析 重要API 1.程式碼 import java.io.*; import java.nio.charset.*;

java核心技術一 筆記1

物件與類注意點: 構造器: 1.不要在構造器中定義與例項域重名的區域性變數 如: public Employee(String n, double s,...) { String name=n;//Error double salary=s//Error ...

Java核心技術 1 多線程

靜態方法 dex 一個 之一 之間 wait方法 com term 操作符 <1>什麽是線程   一個程序同時執行多個任務,每個任務稱為一個線程(thread),它是線程控制的簡稱。可以同時運行一個以上線程的程序稱為多線程程序(nultithreaded)。 &

java 核心技術一筆記 6 .1.接口 lambda 表達式 內部類

參數類型 檢查 get 解決 必須 more jre 序列 忽略 6.1.2 接口不是類,不能實例化一個接口;但是可以聲明接口的變量;Comparable x; 接口變量必須引用實現了接口的類對象;x = new Employee(); 檢查一個對象是否屬於某個特定類

Java核心技術4. java接口、lambda、內部類和代理

arc pau 代理 需求 targe emp 服務 cat 我們 接口 接口概念 接口不是類,而是對類的一組需求描述,這些類要遵從接口描述的統一格式進行定義。 如果類遵從某個特定接口,那麽久履行這項服務。 public interface Comparable<T&

Java核心技術 1(隨筆)

1..java 檔案編譯成.class位元組檔案(執行.class只需要檔名,不要字尾) //編譯成位元組檔案 javac welcome.java //執行位元組檔案.classjava welcome 2.java區分大小寫 3.Java虛擬機器將從指定類中的main方法(即“函式”)開始

Java核心技術 1 第三章總結

 這章主要就介紹Java的基本程式設計結構,比較基礎,我就記下我認為重要和我以前不知道的知識。不過,我認為關於char型別的討論比較重要,也就是與其他語言很不同,我打算另寫一篇文章來總結。 1.Java是純面嚮物件語言,應用程式中的全部內容都必須放置在類中。 2.原始碼的檔名必須與

Java核心技術 I 基礎知識 學習筆記(4

參考:Java核心技術 卷I 基礎知識 一個物件變數可以指示多種實際型別的現象被稱為多型。在執行時能夠自動地選擇呼叫哪個方法的現象被稱為動態繫結。 由一個公共超類派生出來的所有類集合被稱為繼承層次。在繼承層次中,通過某個特定類到其祖先的路徑被稱為該類的繼承鏈。 假設要呼叫x

Java核心技術 I 基礎知識 學習筆記(1

參考  Java核心技術 卷I 基礎知識 Java: 簡單性、面向物件、分散式、健壯性、安全性、體系結構中立、可移植性、解釋型、高效能、多執行緒、動態性。 分散式 Java有一個豐富的例程庫,用於處理像HTTP和FTP之類的TCP/IP協議。Java

java核心技術1知識點

1.comparable和comparator的區別。   Comparable可以認為是一個內比較器,實現了Comparable介面的類有一個特點,就是這些類是可以和自己比較的。 public interface Comparable<T> { public int comp

java核心技術1--物件與類

類的三個特徵 封裝 繼承 多型 物件的三個特性 行為:可以對物件施加哪些操作,或可以對物件施加哪些方法 狀態:當施加那些方法是,物件如何響應 標識:如何辨別具有相同洗行為和狀態的物件 識別類 識別類的簡單規則是尋找名詞和動詞,名詞可能成為類,而動詞可能成為方

Java核心技術 1 基礎知識(第9版)》(中文版)

譯者序 前言 致謝 第1章 Java程式設計概述 1.1 Java程式設計平臺 1.2 Java“白皮書”的關鍵術語 1.2.1 簡單性 1.2.2 面向物件 1.2.3 網路技能 1.2.4 健壯性 1.2.5 安全性 1.2.6 體系結構中立 1.2.7

Java 核心技術 1 第九版 》讀書筆記

本文的主要目的: 將java日常使用中,沒有注意到的或者模糊的點進行記錄。形成文件 3.6字串 三種字串為空的區別 String m="" 有空間,有值 分配了儲存空間 但是值為空字串, String m=null 沒空間,沒值 String m=new

Java核心技術 1 基礎知識(原書第9版)》(完整中文版).pdf

譯者序 前言 致謝 第1章 Java程式設計概述 1.1 Java程式設計平臺 1.2 Java“白皮書”的關鍵術語 1.2.1 簡單性 1.2.2 面向物件 1.2.3 網路技能 1.2.4 健壯性 1.2.5 安全性 1.2.6 體系結構中立 1.2.7 可移植性 1.2.8 解釋型 1.2.9 高效能

學習《Java核心技術1:基礎知識》中物件與類一章中遇到的問題

P101 4.3使用者自定義類 ①Employee類的程式碼要注意內部類問題; ②同一個包中類的重名問題,尤其是寫在同一個檔案中的類; package class20110906; import java.util.Date; import java.util.Greg

Java核心技術 二(一)

rgs code 一個 dir 字節 per workspace spa 核心技術 書:《Java核心技術 卷二 高級特性 9》 時間:2017.9.4 17:13 1.流   輸入流:可以從其中讀取一個字節序列的對象;抽象類(InputStream)   輸出流:可以向其

java 核心技術一筆記 6 .2接口 lambda 表達式 內部類

設置 close 進行 urn show out print -c 筆記 6.2 接口實例 6.2.1  接口與回調 在java.swing包中有一個Timer類,可以使用它在到達給定的時間間隔時發出通告,假如程序中有一個時鐘,就可以請求每秒鐘獲得一個通告,以便更新時鐘的表

Java核心技術一 6. java泛型程序設計

throwable 處理器 sta 局限 強制 變量 amp ray vararg 泛型程序設計 泛型程序設計:編寫的代碼可以被很多不同類型的對象所重用。 類型參數:使用<String>,後者可以省略,因為可以從變量的類型推斷得出。類型參數讓程序更具更好的可讀性

Java核心技術一 2. java對象與類

改變 同時 arc eva pac local class 做出 spa 面向對象程序設計概述 面向對象程序設計(簡稱 OOP )是主流的程序設計範型,取代了早年的結構化過程化程序設計開發技術。Java 是完全面向對象的,必須熟悉 OOP 才能夠編寫 Java 程序。 面向

Java核心技術一 5. java異常、斷言和日誌

form 什麽 表示 ase ... per 分解 new 測試 處理錯誤 由於出現錯誤而使得某些操作沒有完成,程序因該: 返回到一種安全狀態,並能夠讓用戶執行一些其他命令 允許用戶保存所有操作的結果,並以適當的方式終止程序 需要關註的問題: 用戶輸入錯誤 設備錯誤