////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
  http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////
:documentationPath: /plugins/transforms/
:language: en_US
:page-alternativeEditUrl: https://github.com/apache/incubator-hop/edit/master/plugins/transforms/javafilter/src/main/doc/javafilter.adoc

= Java Filter

== Description

The Java Filter transform allows the stream to be filtered using user defined Java expressions. The input stream, coming from one or more transforms, can be redirected to two different transforms based on the evaluation of the written expression.

In other words, the user is able to perform an if-statement to filter the data stream with pure java expressions:

[source,java]
----
if( Condition )
  {matching-transform}
else
  {non-matching transform}
----

== Options

[width="90%", options="header"]
|===
|Option|Description
|Transform name|Name of the transform this name has to be unique in a single pipeline.
|Destination transform for matching rows (optional)|The rows for which the written condition is evaluated to true are sent to this transform.
|Destination transform for non-matching rows (optional)|The rows for which the written condition is evaluated to false are sent to this transform.
|Condition (Java Expression)|Defines the Java condition on which to filter the data. See examples below.
|===

=== Examples

These code samples applies to the Condition (Java Expression) field.

Filters a string that contains white space

[source,java]
----
field.contains(" ");
----

Filters a string that is identical to a constant string

[source,java]
----
field.equals("Positive");
----

Filters a boolean value

[source,java]
----
field == Boolean.TRUE
----