@startuml
package com.iluwatar.fluentinterface.fluentiterable.simple {
  class SimpleFluentIterable<E> {
    - iterable : Iterable<E>
    # SimpleFluentIterable<E>(iterable : Iterable<E>)
    + asList() : List<E>
    + filter(predicate : Predicate<? super E>) : FluentIterable<E>
    + first() : Optional<E>
    + first(count : int) : FluentIterable<E>
    + forEach(action : Consumer<? super E>)
    + from(iterable : Iterable<E>) : FluentIterable<E> {static}
    + fromCopyOf(iterable : Iterable<E>) : FluentIterable<E> {static}
    + getRemainingElementsCount() : int
    + iterator() : Iterator<E>
    + last() : Optional<E>
    + last(count : int) : FluentIterable<E>
    + map(function : Function<? super E, T>) : FluentIterable<T>
    + spliterator() : Spliterator<E>
    + toList(iterator : Iterator<E>) : List<E> {static}
  }
}
package com.iluwatar.fluentinterface.app {
  class App {
    - LOGGER : Logger {static}
    + App()
    + main(args : String[]) {static}
    - negatives() : Predicate<? super Integer> {static}
    - positives() : Predicate<? super Integer> {static}
    - prettyPrint(delimiter : String, prefix : String, iterable : Iterable<E>) {static}
    - prettyPrint(prefix : String, iterable : Iterable<E>) {static}
    - transformToString() : Function<Integer, String> {static}
  }
}
package com.iluwatar.fluentinterface.fluentiterable.lazy {
  abstract class DecoratingIterator<E> {
    # fromIterator : Iterator<E>
    - next : E
    + DecoratingIterator<E>(fromIterator : Iterator<E>)
    + computeNext() : E {abstract}
    + hasNext() : boolean
    + next() : E
  }
  class LazyFluentIterable<E> {
    - iterable : Iterable<E>
    # LazyFluentIterable<E>()
    # LazyFluentIterable<E>(iterable : Iterable<E>)
    + asList() : List<E>
    + filter(predicate : Predicate<? super E>) : FluentIterable<E>
    + first() : Optional<E>
    + first(count : int) : FluentIterable<E>
    + from(iterable : Iterable<E>) : FluentIterable<E> {static}
    + iterator() : Iterator<E>
    + last() : Optional<E>
    + last(count : int) : FluentIterable<E>
    + map(function : Function<? super E, T>) : FluentIterable<T>
  }
}
package com.iluwatar.fluentinterface.fluentiterable {
  interface FluentIterable<E> {
    + asList() : List<E> {abstract}
    + copyToList(iterable : Iterable<E>) : List<E> {static}
    + filter(Predicate<? super E>) : FluentIterable<E> {abstract}
    + first() : Optional<E> {abstract}
    + first(int) : FluentIterable<E> {abstract}
    + last() : Optional<E> {abstract}
    + last(int) : FluentIterable<E> {abstract}
    + map(Function<? super E, T>) : FluentIterable<T> {abstract}
  }
}
LazyFluentIterable ..|> FluentIterable 
SimpleFluentIterable ..|> FluentIterable 
@enduml