summaryrefslogtreecommitdiff
path: root/src/main/java/ch/hiddenalpha/unspecifiedgarbage/stream/StreamUtils.java
blob: bebe9700e9b3deb02f12239d0151e15bb3b76d44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package ch.hiddenalpha.unspecifiedgarbage.stream;


public class StreamUtils {

    /**
     * Copies 'is' to 'os' until end of 'is' is reached. (Blocking)
     *
     * <p>BTW: Using this function makes no longer sense in projects using java
     * 9 or later. Just use {@link java.io.InputStream#transferTo(java.io.OutputStream)}
     * instead.</p>
     *
     * @return
     *      Count of copied bytes.
     */
    public static long copy( java.io.InputStream is, java.io.OutputStream os ) throws java.io.IOException {
        byte[] buffer = new byte[1<<14];
        long totalBytes = 0;
        while( true ){
            int readLen = is.read(buffer, 0, buffer.length);
            if( readLen == -1 ) break; /* EOF */
            totalBytes += readLen;
            os.write(buffer, 0, readLen);
        }
        return totalBytes;
    }

    public static Runnable newCopyTask(java.io.InputStream src, java.io.OutputStream dst, boolean doCloseDst){
        return ()->{
            try{
                for( byte[] buf = new byte[8291] ;; ){
                    int readLen = src.read(buf, 0, buf.length);
                    if( readLen == -1 ) break;
                    dst.write(buf, 0, readLen);
                }
                if( doCloseDst ) dst.close();
            }catch( java.io.IOException ex ){
                throw new RuntimeException(ex);
            }
        };
    }

    public static <SRC,DST> java.util.Iterator<DST> map( java.util.Iterator<SRC> src , java.util.function.Function<SRC,DST> mapper ) {
        return new java.util.Iterator<DST>() {
            @Override public boolean hasNext() { return src.hasNext(); }
            @Override public DST next() { return mapper.apply(src.next()); }
        };
    }

    public static <T> java.util.function.Predicate<T> distinctBy( java.util.function.Function<? super T, ?> keyExtractor ) {
        java.util.Set<Object> seen = java.util.concurrent.ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }

    public static <T> java.util.function.Predicate<T> not( java.util.function.Predicate<T> p ){
        return e -> !p.test(e);
    }

}