77import java .util .Iterator ;
88
99public class Func {
10+ public static interface Each <T > {
11+ public void apply (T t );
12+ }
13+
1014 public static interface Function <T ,R > {
1115 public R apply (T t );
1216 }
@@ -17,15 +21,42 @@ public static interface Reducer<T,E> {
1721
1822 public static <T ,R > ArrayList <R > map (Iterable <T > xs , Function <T ,R > f ) {
1923 ArrayList <R > to = new ArrayList <>();
24+ if (xs == null ) return to ;
25+
2026 for (T x : xs ) {
2127 R ret = f .apply (x );
2228 to .add (ret );
2329 }
2430 return to ;
2531 }
2632
33+ public static <T > void each (Iterable <T > xs , Each <T > f ) {
34+ if (xs == null ) return ;
35+ for (T x : xs ) {
36+ f .apply (x );
37+ }
38+ }
39+
40+ public static ArrayList <Integer > toList (int ... xs ){
41+ ArrayList <Integer > to = new ArrayList <>();
42+ for (int x : xs ) {
43+ to .add (x );
44+ }
45+ return to ;
46+ }
47+
48+ public static <T > ArrayList <T > toList (T ... xs ){
49+ ArrayList <T > to = new ArrayList <>();
50+ for (T x : xs ) {
51+ to .add (x );
52+ }
53+ return to ;
54+ }
55+
2756 public static <T > ArrayList <T > toList (Iterable <T > xs ){
2857 ArrayList <T > to = new ArrayList <>();
58+ if (xs == null ) return to ;
59+
2960 for (T x : xs ) {
3061 to .add (x );
3162 }
@@ -34,6 +65,8 @@ public static <T> ArrayList<T> toList(Iterable<T> xs){
3465
3566 public static <T > ArrayList <T > filter (Iterable <T > xs , Predicate <T > predicate ){
3667 ArrayList <T > to = new ArrayList <>();
68+ if (xs == null ) return to ;
69+
3770 for (T x : xs ) {
3871 if (predicate .apply (x )){
3972 to .add (x );
@@ -43,6 +76,8 @@ public static <T> ArrayList<T> filter(Iterable<T> xs, Predicate<T> predicate){
4376 }
4477
4578 public static <T > T first (Iterable <T > xs , Predicate <T > predicate ){
79+ if (xs == null ) return null ;
80+
4681 for (T x : xs ) {
4782 if (predicate .apply (x )){
4883 return x ;
@@ -51,7 +86,22 @@ public static <T> T first(Iterable<T> xs, Predicate<T> predicate){
5186 return null ;
5287 }
5388
89+ public static <T > T first (Iterable <T > xs ){
90+ if (xs == null ) return null ;
91+
92+ for (T x : xs ) {
93+ return x ;
94+ }
95+ return null ;
96+ }
97+
98+ public static <T > T first (T [] xs ) {
99+ return xs == null || xs .length == 0 ? null : xs [0 ];
100+ }
101+
54102 public static <T > T last (Iterable <T > xs , Predicate <T > predicate ){
103+ if (xs == null ) return null ;
104+
55105 for (T x : reverse (xs )) {
56106 if (predicate .apply (x )){
57107 return x ;
@@ -60,13 +110,29 @@ public static <T> T last(Iterable<T> xs, Predicate<T> predicate){
60110 return null ;
61111 }
62112
113+ public static <T > T last (Iterable <T > xs ){
114+ if (xs == null ) return null ;
115+
116+ T last = null ;
117+ for (T x : xs ) {
118+ last = x ;
119+ }
120+ return last ;
121+ }
122+
123+ public static <T > T last (T [] xs ) {
124+ return xs == null ? null : xs [xs .length - 1 ];
125+ }
126+
63127 public static <T > boolean contains (Iterable <T > xs , Predicate <T > predicate ){
64128 return first (xs , predicate ) != null ;
65129 }
66130
67131 public static <T > ArrayList <T > skip (Iterable <T > xs , int skip ){
68132 int i = 0 ;
69133 ArrayList <T > to = new ArrayList <>();
134+ if (xs == null ) return to ;
135+
70136 for (T x : xs ) {
71137 if (i ++ >= skip ){
72138 to .add (x );
@@ -77,6 +143,8 @@ public static <T> ArrayList<T> skip(Iterable<T> xs, int skip){
77143
78144 public static <T > ArrayList <T > skip (Iterable <T > xs , Predicate <T > predicate ){
79145 ArrayList <T > to = new ArrayList <>();
146+ if (xs == null ) return to ;
147+
80148 for (T x : xs ) {
81149 if (predicate .apply (x )){
82150 to .add (x );
@@ -87,6 +155,8 @@ public static <T> ArrayList<T> skip(Iterable<T> xs, Predicate<T> predicate){
87155
88156 public static <T > ArrayList <T > take (Iterable <T > xs , Predicate <T > predicate ){
89157 ArrayList <T > to = new ArrayList <>();
158+ if (xs == null ) return to ;
159+
90160 for (T x : xs ) {
91161 if (predicate .apply (x )){
92162 return to ;
@@ -99,6 +169,8 @@ public static <T> ArrayList<T> take(Iterable<T> xs, Predicate<T> predicate){
99169 public static <T > ArrayList <T > take (Iterable <T > xs , int take ){
100170 int i = 0 ;
101171 ArrayList <T > to = new ArrayList <>();
172+ if (xs == null ) return to ;
173+
102174 for (T x : xs ) {
103175 if (i ++ >= take ){
104176 return to ;
@@ -109,6 +181,8 @@ public static <T> ArrayList<T> take(Iterable<T> xs, int take){
109181 }
110182
111183 public static <T > boolean any (Iterable <T > xs , Predicate <T > predicate ){
184+ if (xs == null ) return false ;
185+
112186 for (T x : xs ) {
113187 if (predicate .apply (x )){
114188 return true ;
@@ -118,6 +192,8 @@ public static <T> boolean any(Iterable<T> xs, Predicate<T> predicate){
118192 }
119193
120194 public static <T > boolean all (Iterable <T > xs , Predicate <T > predicate ){
195+ if (xs == null ) return false ;
196+
121197 for (T x : xs ) {
122198 if (!predicate .apply (x )){
123199 return false ;
@@ -128,6 +204,8 @@ public static <T> boolean all(Iterable<T> xs, Predicate<T> predicate){
128204
129205 public static <T > ArrayList <T > expand (Iterable <T >... xss ){
130206 ArrayList <T > to = new ArrayList <>();
207+ if (xss == null ) return to ;
208+
131209 for (Iterable <T > xs : xss ) {
132210 for (T x : xs ){
133211 to .add (x );
@@ -137,6 +215,8 @@ public static <T> ArrayList<T> expand(Iterable<T>... xss){
137215 }
138216
139217 public static <T > T elementAt (Iterable <T > xs , int index ){
218+ if (xs == null ) return null ;
219+
140220 int i = 0 ;
141221 for (T x : xs ){
142222 if (i ++ == index ){
@@ -147,12 +227,16 @@ public static <T> T elementAt(Iterable<T> xs, int index){
147227 }
148228
149229 public static <T > ArrayList <T > reverse (Iterable <T > xs ){
230+ if (xs == null ) return new ArrayList <T >();
231+
150232 ArrayList <T > clone = toList (xs );
151233 Collections .reverse (clone );
152234 return clone ;
153235 }
154236
155237 public static <T ,E > E reduce (Iterable <T > xs , E initialValue , Reducer <T ,E > reducer ){
238+ if (xs == null ) return initialValue ;
239+
156240 E currentValue = initialValue ;
157241 for (T x : xs ){
158242 currentValue = reducer .reduce (currentValue , x );
@@ -166,6 +250,8 @@ public static <T,E> E reduceRight(Iterable<T> xs, E initialValue, Reducer<T,E> r
166250
167251 public static <T > String join (Iterable <T > xs , String separator ){
168252 StringBuilder sb = new StringBuilder ();
253+ if (xs == null ) return sb .toString ();
254+
169255 for (T x : xs ){
170256 if (sb .length () > 0 )
171257 sb .append (separator );
0 commit comments