java8流
❶ java8並行流是基於fork-join框架嗎
恩恩,是的,你可以參考一下我之前的一個回答,當時寫的還算比較細
https://segmentfault.com/q/1010000007087438/a-1020000007526535
❷ Java8中List直接寫forEach與調用.stream().forEach()有何差別
java8中,引入了流的概念,主要的目的還是為了,提高代碼的可讀性和編寫代碼時的實效性,實際上,在簡單的代碼邏輯中,流的優勢並體現不出來,但是在復雜的業務操作邏輯中,流的優勢就很大了。
那你應該注意的,不是foreach的區別,而是用傳統的集合工具實現循環,和用流的概念來實現循環的區別。
所以還是認真的了解流(stream)的概念
❸ java8的stream().mapToInt()什麼意思
Stream(流)是一個來自數據源的元素隊列並支持聚合操作
<strong元素隊列< strong="">元素是特定類型的對象,形成一個隊列。 Java中的Stream並不會存儲元素,而是按需計算。
數據源 流的來源。 可以是集合,數組,I/O channel, 產生器generator 等。
聚合操作 類似SQL語句一樣的操作, 比如filter, map, rece, find, match, sorted等。
可以試試這個輸出什麼:
String[] strarr = {"abc", "defg", "vwxyz"};
int iSum = Arrays.stream(strarr)
.mapToInt(s -> s.length())
.sum();
System.out.println("長度和: "+iSum);
(3)java8流擴展閱讀:
Java還包括一個類的擴展集合,分別組成各種程序包(Package),用戶可以在自己的程序中使用。例如,Java提供產生圖形用戶介面部件的類(java.awt包),這里awt是抽象窗口工具集(abstract windowing toolkit)的縮寫,處理輸入輸出的類(java.io包)和支持網路功能的類(java.net包)。
❹ 如何使用Java 8的流介面解析文件
讀取器會按照這樣的協議來讀取:文件頭是一個字元串列表,而記錄集是一個字元串列表的列表。讀取器接受一個java.io.Reader對象用為讀取來源。 先從讀取文件頭開始。讀取文件頭的演算法如下: - 打開資源准備讀取。 - 讀取第一行然後解析 - 將行按分隔符分割。 - 將該行轉化成一個字元串列表後返回 下面是它的實現。
class CsvReader {
private static final String SEPARATOR = ";";
private final Reader source;
CsvReader(Reader source) {
this(source);
}
List<String> readHeader() {
try (BufferedReader reader = new BufferedReader(source)) {
return reader.lines()
.findFirst()
.map(line -> Arrays.asList(line.split(SEPARATOR)))
.get();
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
相當簡單,自我解釋型的。類似的,創建了一個方法來讀取所有的記錄。讀取記錄的演算法如下:
打開資源文件進行讀取
跳過首行
用分隔符分割行。
對每行應用一個map操作,將行映射到一個字元串列表
下面是它的實現:
class CsvReader {
List<List<String>> readRecords() {
try (BufferedReader reader = new BufferedReader(source)) {
return reader.lines()
.substream(1)
.map(line -> Arrays.asList(line.split(separator)))
.collect(Collectors.toList());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
會注意到兩個方法中的map是幾乎一樣的。事實上,它可以提取到一個變數裡面:
Function<String, List<String>> mapper
= line -> Arrays.asList(line.split(separator));
我寫了個測試來完成整個過程。
public class CsvReaderTest {
@Test
public void readsHeader() {
CsvReader csvReader = createCsvReader();
List<String> header = csvReader.readHeader();
assertThat(header)
.contains("username")
.contains("visited")
.hasSize(2);
}
@Test
public void readsRecords() {
CsvReader csvReader = createCsvReader();
List<List<String>> records = csvReader.readRecords();
assertThat(records)
.contains(Arrays.asList("jdoe", "10"))
.contains(Arrays.asList("kolorobot", "4"))
.hasSize(2);
}
private CsvReader createCsvReader() {
try {
Path path = Paths.get("src/test/resources", "sample.csv");
Reader reader = Files.newBufferedReader(
path, Charset.forName("UTF-8"));
return new CsvReader(reader);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}
❺ java8的的流stream可以指定核數嗎
在介紹Java 8的流(Stream)時,我們學會了一些集合操作的實用技巧。現在我們要看看怎樣把這些循環轉換為更簡潔,可讀性更高的代碼。 開始編碼! 好吧,講的夠多了,是時候展示一些例子了! 這次我們要以文章為例子。一篇文章擁有一個標題,一個...
❻ java中的「流」是什麼
Java中的流是個抽象的概念,當程序需要從某個數據源讀入數據的時候,就會開啟一個數據流,數據源可以是文件、內存或網路等等。相反地,需要寫出數據到某個數據源目的地的時候,也會開啟一個數據流,這個數據源目的地也可以是文件、內存或網路等等
Java中的流可以從不同的角度進行分類:
按照流的方向不同:分為輸入流和輸出流。
按照處理數據單位的不同:分為位元組流(8位)和字元流(16位)。
按照功能不同:分為節點流和處理流。
節點流:是可以從一個特定的數據源(節點)讀寫數據的流(例如文件,內存)。就像是一條單一的管子接到水龍頭上開始放水。
處理流:是「連接」在已經存在的流(節點流或處理流)之上,通過對數據的處理為程序提供更為強大的讀寫功能。就像在已經接了一條管子(節點流)的基礎上,又套上幾個更粗,具有特殊功能的管子(處理流)對流出的水進一步的處理。
四種基本流InputStream,OutputStream,Reader,Writer又分別有更具體的子類,分為文件流,緩沖流,數據流,轉換流,Print流,Object流等,都分別有特定的功能或用來操作特定的數據
❼ Java8 Stream有沒有提供多重條件執行
先回答題主問題,木有...
Java8的流Stream在我理解來說,是提供了一種操作數據的一種流程...類似生產流水線...感覺是讓我們逐步把以前命令式的代碼風格融入一些聲明式的風格,要解決這個問題,是不是可以轉換哈思考方式,既然題主想用Stream來解決,那何不用Stream的方式來思考
就像剛才說到的,Stream是類似生產流水線式的...那想想生產流水線上,比如可樂生產流水線,先處理可樂罐,清洗,灌裝可樂,訂上可樂拉環等等,這每一步操作,應該是沒有什麼特殊情況來特殊處理吧,每罐可樂都是一樣的處理的,這才是生產流水線
同理Stream也是一樣...這回要處理的是Stream里的數據,先貼代碼(一些set,get方法,構造方法省略了)
❽ java 8 流式計算 mapToDouble 會丟失精度嗎
List<String> list = Arrays.asList("11.11555", "11.225555", "11.35553");
list.stream().mapToDouble(p -> Double.parseDouble(p)).forEach(System.out::println);
mapToDouble應該不會丟失精度,這一步操作只是轉換而已。丟失應該會在統計計算的時候丟失
❾ Java8有哪些新特性
一、lambda表達式
二、函數介面
三、介面的默認方法和靜態方法
四、註解
五、參數名稱
六、容器:Optional(可選的)
七、日期
八、Stream
❿ Java8 Stream中小弟我怎麼對多個欄位分組
在介紹Java 8的流(Stream)時,我們學會了一些集合操作的實用技巧。現在我們要看看怎樣把這些循環轉換為更簡潔,可讀性更高的代碼。
開始編碼!
好吧,講的夠多了,是時候展示一些例子了!
這次我們要以文章為例子。一篇文章擁有一個標題,一個作者和幾個標簽。
private class Article {
private final String title;
private final String author;
private final List<String> tags;
private Article(String title, String author, List<String> tags) {
this.title = title;
this.author = author;
this.tags = tags;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public List<String> getTags() {
return tags;
}
}
每個例子都會包含一個使用傳統循環的方案和一個使用Java 8新特性的方案。
在第一個例子里,我們要在集合中查找包含「Java」標簽的第一篇文章。
看一下使用for循環的解決方案。
public Article getFirstJavaArticle() {
for (Article article : articles) {
if (article.getTags().contains("Java")) {
return article;
}
}
return null;
}
現在我們使用Stream API的相關操作來解決這個問題。
public Optional<Article> getFirstJavaArticle() {
return articles.stream()
.filter(article -> article.getTags().contains("Java"))
.findFirst();
}
是不是很酷?我們首先使用 filter 操作去找到所有包含Java標簽的文章,然後使用 findFirst()
操作去獲取第一次出現的文章。因為Stream是「延遲計算」(lazy)的並且filter返回一個流對象,所以這個方法僅在找到第一個匹配元素時才會
處理元素。
現在,讓我們獲取所有匹配的元素而不是僅獲取第一個。
首先使用for循環方案。
public List<Article> getAllJavaArticles() {
List<Article> result = new ArrayList<>();
for (Article article : articles) {
if (article.getTags().contains("Java")) {
result.add(article);
}
}
return result;
}
使用Stream操作的方案。
public List<Article> getAllJavaArticles() {
return articles.stream()
.filter(article -> article.getTags().contains("Java"))
.collect(Collectors.toList());
}
在這個例子里我們使用 collection 操作在返迴流上執行少量代碼而不是手動聲明一個集合並顯式地添加匹配的文章到集合里。
到目前為止還不錯。是時候舉一些突出Stream API強大的例子了。
根據作者來把所有的文章分組。
照舊,我們使用循環方案。
public Map<String, List<Article>> groupByAuthor() {
Map<String, List<Article>> result = new HashMap<>();
for (Article article : articles) {
if (result.containsKey(article.getAuthor())) {
result.get(article.getAuthor()).add(article);
} else {
ArrayList<Article> articles = new ArrayList<>();
articles.add(article);
result.put(article.getAuthor(), articles);
}
}
return result;
}
我們能否找到一個使用流操作的簡潔方案來解決這個問題?
public Map<String, List<Article>> groupByAuthor() {
return articles.stream()
.collect(Collectors.groupingBy(Article::getAuthor));
}
很好!使用 groupingBy 操作和 getAuthor 方法,我們得到了更簡潔、可讀性更高的代碼。
現在,我們查找集合中所有不同的標簽。
我們從使用循環的例子開始。
public Set<String> getDistinctTags() {
Set<String> result = new HashSet<>();
for (Article article : articles) {
result.addAll(article.getTags());
}
return result;
}
好,我們來看看如何使用Stream操作來解決這個問題。
public Set<String> getDistinctTags() {
return articles.stream()
.flatMap(article -> article.getTags().stream())
.collect(Collectors.toSet());
}
棒極了!flatmap 幫我把標簽列表轉為一個返迴流,然後我們使用 collect 去創建一個集合作為返回值。
一切皆有可能
以上的就是如何使用可讀性更高的代碼代替循環的例子。務必仔細看看Stream API,因為這篇文章僅僅提到它的一些皮毛而已。