View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  package org.apache.commons.io.function;
19  
20  import java.io.Closeable;
21  import java.io.IOException;
22  import java.io.UncheckedIOException;
23  import java.util.stream.BaseStream;
24  import java.util.stream.Stream;
25  
26  /**
27   * Like {@link BaseStream} but throws {@link IOException}.
28   *
29   * @param <T> the type of the stream elements.
30   * @param <S> the type of the IO stream extending {@code IOBaseStream}.
31   * @param <B> the type of the stream extending {@code BaseStream}.
32   * @since 2.12.0
33   */
34  public interface IOBaseStream<T, S extends IOBaseStream<T, S, B>, B extends BaseStream<T, B>> extends Closeable {
35  
36      /**
37       * Constructs a {@link BaseStream} for this instance that throws {@link UncheckedIOException} instead of
38       * {@link IOException}.
39       *
40       * @return an {@link UncheckedIOException} {@link BaseStream}.
41       */
42      @SuppressWarnings("unchecked")
43      default BaseStream<T, B> asBaseStream() {
44          return new UncheckedIOBaseStream<>((S) this);
45      }
46  
47      /**
48       * Like {@link BaseStream#close()}.
49       *
50       * @see BaseStream#close()
51       */
52      @Override
53      default void close() {
54          unwrap().close();
55      }
56  
57      /**
58       * Like {@link BaseStream#isParallel()}.
59       *
60       * @return See {@link BaseStream#isParallel() delegate}.
61       * @see BaseStream#isParallel()
62       */
63      @SuppressWarnings("resource") // for unwrap()
64      default boolean isParallel() {
65          return unwrap().isParallel();
66      }
67  
68      /**
69       * Like {@link BaseStream#iterator()}.
70       *
71       * @return See {@link BaseStream#iterator() delegate}.
72       * @see BaseStream#iterator()
73       */
74      @SuppressWarnings("resource") // for unwrap()
75      default IOIterator<T> iterator() {
76          return IOIteratorAdapter.adapt(unwrap().iterator());
77      }
78  
79      /**
80       * Like {@link BaseStream#onClose(Runnable)}.
81       *
82       * @param closeHandler See {@link BaseStream#onClose(Runnable) delegate}.
83       * @return See {@link BaseStream#onClose(Runnable) delegate}.
84       * @throws IOException if an I/O error occurs.
85       * @see BaseStream#onClose(Runnable)
86       */
87      @SuppressWarnings({"unused", "resource"}) // throws IOException, unwrap()
88      default S onClose(final IORunnable closeHandler) throws IOException {
89          return wrap(unwrap().onClose(() -> Erase.run(closeHandler)));
90      }
91  
92      /**
93       * Like {@link BaseStream#parallel()}.
94       *
95       * @return See {@link BaseStream#parallel() delegate}.
96       * @see BaseStream#parallel()
97       */
98      @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
99      default S parallel() {
100         return isParallel() ? (S) this : wrap(unwrap().parallel());
101     }
102 
103     /**
104      * Like {@link BaseStream#sequential()}.
105      *
106      * @return See {@link BaseStream#sequential() delegate}.
107      * @see BaseStream#sequential()
108      */
109     @SuppressWarnings({"resource", "unchecked"}) // for unwrap(), this
110     default S sequential() {
111         return isParallel() ? wrap(unwrap().sequential()) : (S) this;
112     }
113 
114     /**
115      * Like {@link BaseStream#spliterator()}.
116      *
117      * @return See {@link BaseStream#spliterator() delegate}.
118      * @see BaseStream#spliterator()
119      */
120     @SuppressWarnings("resource") // for unwrap()
121     default IOSpliterator<T> spliterator() {
122         return IOSpliteratorAdapter.adapt(unwrap().spliterator());
123     }
124 
125     /**
126      * Like {@link BaseStream#unordered()}.
127      *
128      * @return See {@link BaseStream#unordered() delegate}.
129      * @see java.util.stream.BaseStream#unordered()
130      */
131     @SuppressWarnings("resource") // for unwrap()
132     default S unordered() {
133         return wrap(unwrap().unordered());
134     }
135 
136     /**
137      * Unwraps this instance and returns the underlying {@link Stream}.
138      * <p>
139      * Implementations may not have anything to unwrap and that behavior is undefined for now.
140      * </p>
141      *
142      * @return the underlying stream.
143      */
144     B unwrap();
145 
146     /**
147      * Wraps a {@link Stream}.
148      *
149      * @param delegate The delegate.
150      * @return An IO stream.
151      */
152     S wrap(B delegate);
153 
154 }