11package stream ;
22
3+ import functional .Accumulate ;
34import functional .ForEach ;
45import functional .Map ;
56import functional .NextItem ;
@@ -19,37 +20,8 @@ public class Stream <T> implements StreamInterface<T>{
1920
2021 private boolean isEnd ;
2122
22- /**
23- * 是否被求值过
24- * */
25- private boolean evaled ;
26-
2723 private NextItem <T > eval ;
2824
29- public T getHead () {
30- return head ;
31- }
32-
33- public void setHead (T head ) {
34- this .head = head ;
35- }
36-
37- public Stream <T > getTail () {
38- return tail ;
39- }
40-
41- public void setTail (Stream <T > tail ) {
42- this .tail = tail ;
43- }
44-
45- public NextItem <T > getEval () {
46- return eval ;
47- }
48-
49- public void setEval (NextItem <T > eval ) {
50- this .eval = eval ;
51- }
52-
5325 //====================================构造函数===============================
5426
5527 public Stream () {
@@ -72,19 +44,29 @@ public Stream(boolean isEnd) {
7244
7345 @ Override
7446 public <R > Stream <R > map (Map <R ,T > mapper ){
75- return map (mapper ,this );
47+ Stream <R > lazy = new Stream <>(()-> map (mapper ,this ));
48+ return lazy ;
7649 }
7750
7851 @ Override
7952 public Stream <T > filter (Predicate <T > predicate ){
80-
8153 return new Stream <>();
8254 }
8355
56+ @ Override
57+ public Stream <T > limit (int n ) {
58+ return limit (n ,this );
59+ }
60+
8461 @ Override
8562 public void forEach (ForEach <T > forEach ){
8663 }
8764
65+ @ Override
66+ public <R > R reduce (R initVal ,Accumulate <R ,T > accumulator ) {
67+ return reduce (initVal ,accumulator ,this .eval .apply ());
68+ }
69+
8870 //=====================================私有方法=====================================
8971
9072 private <R > Stream <R > map (Map <R ,T > mapper ,Stream <T > stream ){
@@ -93,24 +75,38 @@ private <R> Stream<R> map(Map<R,T> mapper,Stream<T> stream){
9375 }
9476
9577 R head = mapper .apply (stream .head );
96- Stream tail = new Stream <>(
97- ()-> map (mapper ,stream .force ()
98- ));
78+ Stream <R > tail = new Stream <>(
79+ ()-> map (mapper ,stream .force ())
80+ );
81+ return new Stream <>(head , tail );
82+ }
9983
84+ private Stream <T > limit (int n , Stream <T > stream ){
85+ if (n <= 0 ){
86+ return StreamInterface .makeEmptyStream ();
87+ }
10088
101- Stream newStream = new Stream (
102- head ,
103- tail
104- );
105- return newStream ;
89+ T head = stream . head ;
90+
91+ Stream < T > tail = limit ( n - 1 , stream . force ());
92+
93+ return new Stream <>( head , tail ) ;
10694 }
10795
108- private void delay (NextItem <T > nextItem ){
96+ private <R > R reduce (R initVal ,Accumulate <R ,T > accumulator ,Stream <T > stream ){
97+ if (isEmptyStream (stream )){
98+ return initVal ;
99+ }
109100
101+ T head = stream .head ;
102+ R tail = reduce (initVal ,accumulator ,stream .force ());
103+
104+ return accumulator .apply (tail ,head );
110105 }
111106
112- private Stream force (){
113- return this .tail .eval .apply ();
107+ private Stream <T > force (){
108+ Stream <T > eval = this .tail .eval .apply ();
109+ return eval ;
114110 }
115111
116112 private static boolean isEmptyStream (Stream stream ){
0 commit comments