stream和io流沒(méi)有什么關(guān)系。
它是操作管道獲取source(從各種數(shù)據(jù)中獲得比如array,list....)并處理數(shù)據(jù)
public class study1 {
private static class myRand implements Supplier{
private int index=0;
private Random random=new Random();
@Override
public Object get() {
int num=random.nextInt(100);
return String.valueOf(num);
}
}
static class Person{
private String name;
public Person() {
}
public Person(String name) {
this.name=name;
}
public void setName(String name) {
this.name=name;
}
public String getName() {
return name;
}
public int getage() {
return Integer.parseInt(name);
}
}
public static void main(String[] args) throws FileNotFoundException {
//流的構(gòu)造
Stream stream=Stream.of("a","b");
String [] arr=new String[] {"a","b"};
stream=Stream.of(arr);
stream=Arrays.stream(arr);
List<String> list=Arrays.asList(arr);
stream=list.stream();
//數(shù)值流
IntStream.of(new int[] {1,2,3,4,5}).forEach(System.out::println);
IntStream.range(1,3).forEach(System.out::println); //1
IntStream.rangeClosed(1, 3).forEach(System.out::println); //2 1.2的區(qū)別在于,2是閉區(qū)間摹芙,所以會(huì)輸出1.2.3,而2是開(kāi)區(qū)間智慧輸出1.2
//流轉(zhuǎn)化為其他類(lèi)型
Object[] arr2=stream.toArray(String[] :: new);
Stream stream2=Stream.of(arr2);
//List<String> list2=(List<String>) stream.collect(Collectors.toList());
Stack stack=(Stack) stream2.collect(Collectors.toCollection(Stack::new)); //每個(gè)資源只能被利用一次
//String str = stream2.collect(Collectors.joining()).toString();
//Set set1 = (Set) stream2.collect(Collectors.toSet());
//用map把list元素全變?yōu)榇髮?xiě)
List<String> wordList=new ArrayList<>();
wordList.add("dasda");
wordList.add(1,"aaa");
List<String> list3=wordList.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
list3.stream().forEach(System.out::println);
//一對(duì)多的map
Stream<List<Integer>> stream3=Stream.of(
Arrays.asList(1,2,3),
Arrays.asList(4,5,6)
);
stream3.flatMap((chilelist)->chilelist.stream()) //如果使用map那么這一步得到的是兩個(gè)stream,而flatMap會(huì)將其都合并成一個(gè)stream,那么現(xiàn)在的stream中全部都是數(shù)字
.forEach(System.out::println);
//過(guò)濾器filter
Integer[] num= {1,2,3,4,5,6,7,8};
Integer[] newnum=Stream.of(num)
.filter(n -> n%5 == 0)
.toArray(Integer[] :: new);
Stream.of(newnum).forEach(System.out::println);
//lines()只是針對(duì)bufferReader的井濒,也就是針對(duì)文件的
File file=new File("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt");
InputStream in=new FileInputStream(file);
InputStreamReader reader=new InputStreamReader(in);
BufferedReader b=new BufferedReader(reader);
List<String> myList=b.lines()
.flatMap(n -> Stream.of(n.split(" "))) //這里的單位是行燃箭,因?yàn)闆](méi)辦法用StringTokenizer昏苏,所以只能對(duì)每一行分流
.filter(n -> n.length()>0)
.collect(Collectors.toList());
myList.stream()
.peek(e->System.out.println(e)) //peek和forEach的區(qū)別是肴盏,peak操作不會(huì)被消費(fèi)
.forEach(System.out::println);
String nu=null;
Optional.ofNullable(nu).ifPresent(System.out::println);
//reduce合并函數(shù)
String concat = Stream.of("A","B","C").reduce("",String::concat);
System.out.println(concat);
double min=Stream.of(-1.5,-2.0,-3.0).reduce(Double.MIN_VALUE,Double::min);
System.out.println(min);
Integer sum=Stream.of(1,2,3,4,5,6).reduce(Integer::sum).get();
System.out.println(sum);
//limit指定只要前幾個(gè)數(shù)芋浮,skip去掉前幾個(gè)數(shù)抱环,sorted進(jìn)行排序
List<Integer> list2=Arrays.asList(1,2,3,4,43,64,63,636,4,63,3,11);
list2.stream() //list只能用list.stream建立流
.limit(8)
.skip(2)
.sorted((a1,b1)-> b1.compareTo(a1)) //sort可以自定義
.forEach(System.out::println);
//distinct除去重復(fù)項(xiàng),Match可以匹配到是否有該元素纸巷,其類(lèi)還有NoneMatch,allMatch返回布爾值
BufferedReader buf=new BufferedReader(new FileReader("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt"));
int longlen=buf.lines()
.mapToInt(ak -> ak.length()) //直接處理整行處理
.max()
.getAsInt();
System.out.println(longlen);
BufferedReader buff=new BufferedReader(new FileReader("/home/yhw/eclipse-workspace/TheHolleWord/src/streams/words.txt"));
boolean n=buff.lines()
.flatMap((mp) -> Stream.of(mp.split(" "))) //flatMap是將一行的單詞切分后镇草,變?yōu)榱藛卧~流,相當(dāng)于一行變多個(gè)
.filter(fi -> fi.length()>0)
.map(String::toLowerCase)
.peek(wo -> System.out.println(wo))
.distinct()
.anyMatch(word -> word.equals("ages"));
System.out.println(n);
//自定義流:模擬生成隨機(jī)數(shù)何暇,一般用于自定義的數(shù)據(jù)類(lèi)型
List<Person> list4=(List<Person>) Stream.generate(new myRand()).
limit(100).
peek(p->new Person(String.valueOf(p)))
.collect(Collectors.toList());
//conllect歸組
Map<String, List<Person>> map=(Map<String, List<Person>>) Stream.generate(new myRand2()).
limit(100).
collect(Collectors.groupingBy(Person::getName));
Iterator iterator=map.entrySet().iterator(); //先轉(zhuǎn)化為迭代器陶夜,那么返回的每個(gè)對(duì)象,就是一個(gè)key(String)對(duì)應(yīng)一個(gè)value(List)
while(iterator.hasNext()) {
Map.Entry<String,List<Person>> pEntry=(Entry<String, List<Person>>) iterator.next();
System.out.println(pEntry.getKey()+":"+pEntry.getValue().get(0));
}
List<Person> list5=new ArrayList<>();
list5.add(new myRand2().get());
list5.add(new myRand2().get());
list5.add(new myRand2().get());
list5.add(new myRand2().get());
list5.add(new myRand2().get());
/*Map<Boolean, List<Person>> children = Stream.generate(new myRand()). //這個(gè)p就是object而不是Person
limit(100).
collect(Collectors.partitioningBy(p -> p.getAge() < 18));*/
Map<Boolean,List<Person>>maps=list5.stream().collect(Collectors.partitioningBy(p->p.getage()<18)); //只有當(dāng)有明確數(shù)據(jù)類(lèi)型時(shí)裆站,p才是確定的數(shù)據(jù)類(lèi)型
System.out.println(maps.get(true).size());
}
@SuppressWarnings("rawtypes")
private static class myRand2 implements Supplier{
private int index=0;
private Random random=new Random();
@Override
public Person get() {
int num=random.nextInt(100);
return new Person(String.valueOf(num));
}
}
}
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/