如果覺得我寫的還行,請關注我的博客並且點個贊喲。本文主要介紹JAVA Stream 流相關知識,通過閱讀本文,你將掌握Stream的基本用法。
如果不知道Stream是什麼,請閱讀博文天天學JAVA-JAVA基礎(2)這篇文章。
1.流的常用創建方法有以下四種
2.Stream具體用法
3.一道阿里面試題,你會做嗎?
1. 流的常用創建方法有以下四種
package com.cy.lambda.learning;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Stream;
/**
* cy
*
*/
public class CreateStreamDemo {
public static void main(String[] args) {
//1.使用Collection下的 stream() 和 parallelStream() 方法
List<String> list = new ArrayList<String>();
Stream<String> stream =list.stream();//創建一個串行流
Stream<String> parallelStream =list.parallelStream();//創建一個並行流
//2.使用Arrays 中的 stream() 方法,將數組轉成流
String[] nums = new String[10];
Stream<String> alist = Arrays.stream(nums);
//3.使用Stream中的靜態方法:of()、iterate()、generate
//of
Stream<Integer> streamk = Stream.of(1,2,3,4,5,6);
//iterate
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
//generate
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);
//4.使用 Pattern.splitAsStream() 方法,將字符串分隔成流
Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);
}
}
2.Stream具體用法
1.篩選和切片
package com.cy.lambda.learning;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
/**
* cy
* 流的篩選與切片
*/
public class FilteringAndSlicingDemo {
public static void main(String[] args) {
//數據初始化
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
for (int i = 0; i < 10 ;i ++){
list.add(i);
//System.out.println(i);
}
//filter:過濾流中的某些元素
list.stream().filter(s -> s<3) //1,1,2
.forEach(System.out::print);
// limit(n):獲取n個元素
list.stream().limit(3)
.forEach(System.out::print);
//skip(n):跳過n元素,配合limit(n)可實現分頁
list.stream().skip(2).forEach(System.out::print);
//distinct:通過流中元素的 hashCode() 和 equals() 去除重複元素
list.stream().distinct().forEach(System.out::print);
//綜合
list.stream().filter(s -> s<=6)
.distinct()
.skip(2)
.limit(3).forEach(System.out::print;);
}
}
2.映射
package com.cy.lambda.learning;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class MappingDemo {
public static void main(String[] args) {
//map(Function f) 接受一個函數作爲參數,
//並將函數應用到每一個元素上,返回新的元素
// mapToDouble(ToDoubleFunction f) 返回的新元素爲double類型
// mapToInt(ToIntFunction f) 返回的新元素爲int類型
// mapToLong(ToLongFunction f) 返回的新元素爲long類型
// flatMap(Function f) 操作多層嵌套的流,使其扁平化
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
for (int i = 0; i < 10 ;i ++){
list.add(i);
//System.out.println(i);
}
//接受一個函數作爲參數,並將函數應用到每一個元素上,返回新的元素
System.out.println("int :");
list.stream().map(s -> s.intValue());
//返回的新元素爲double類型
list.stream().mapToDouble(s -> s.intValue());
// mapToInt(ToIntFunction f) 返回的新元素爲int類型
list.stream().mapToInt(s -> s.intValue());
//mapToLong(ToLongFunction f) 返回的新元素爲long類型
list.stream().mapToLong(s-> s).forEach(System.out::print);
//flatMap(Function f) 操作多層嵌套的流,使其扁平化
list.stream().flatMap(s ->{
Stream<String> stream = Stream.empty();
return stream;
});
}
}
3 排序
package com.cy.lambda.learning;
import java.util.Arrays;
import java.util.List;
/**
* cc程序員
*
*/
public class StreamSortDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("aa", "ff", "dd","bb");
//sorted 產生一個新流,其中按自然順序排序
list.stream().sorted().forEach(System.out::print);
System.out.println();
People people = new People("111",11,"1");
People people1 = new People("113",13,"1");
People people2 = new People("115",13,"1");
//
List<People> list1 = Arrays.asList(people,people1,people2);
list1.stream().sorted(
(p1,p2) ->{
if(p1.getUserNaMme().equals(p2.getUserNaMme())){
return p1.getAge() - p2.getAge();
}else {
return p1.getUserNaMme().compareTo(p2.getUserNaMme()) ;
}
}
).forEach(s ->{
System.out.println(s.toString());
});
}
}
class People{
private String userNaMme;
private Integer age;
private String sex;
public People(String userNaMme, Integer age, String sex) {
this.userNaMme = userNaMme;
this.age = age;
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getUserNaMme() {
return userNaMme;
}
public void setUserNaMme(String userNaMme) {
this.userNaMme = userNaMme;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "People{" +
"userNaMme='" + userNaMme + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}
今天的代碼分享就到這裏了,上面的例子代碼已經上傳至github上stream實例,有需要的可以下載下來運行。下面分享一道來自阿里的面試題。
3.有一個類B繼承自類A,他們數據成員如下:
class A {
...
private:
int &a;
};
class B : public A {
...
private:
int a;
public:
const int b;
A c;
static const char* d;
A* e;
};
則構造函數中,成員變量一定要通過初始化列表來初始化的是____。
A. b c
B.b c e
C.b c d e
D.c e
E.b d
F.b e
如果你想知道答案或者你知道答案,請留言或者關注下方公衆號,並且回覆1029,將會得到答案和解析喲。
如果你覺得我寫的還行,請關注我的博客並且點個贊喲,也請關注我的公衆號並加入下方QQ羣,每天都會定時推送乾貨以及共享一些優質的學習資料和視頻喲.