<!--
  ~  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.
  -->

<html>
<h2>FlatMapElements</h2>
<p>The Beam SDKs provide language-specific ways to simplify how you provide your DoFn implementation.</p>
<p>FlatMapElements can be used to simplify DoFn that maps an element to multiple elements (one to many).</p>
<p>In this task, we are going to implement a function that maps each input sentence into words tokenized by whitespace (" ") using
    <a href="https://beam.apache.org/releases/javadoc/2.11.0/org/apache/beam/sdk/transforms/FlatMapElements.html">
        FlatMapElements.into(...).via(...)</a>.
</p>
<br>
<br>
<div class='hint'>Use
    <a href="https://beam.apache.org/releases/javadoc/2.11.0/org/apache/beam/sdk/transforms/FlatMapElements.html">FlatMapElements.into(...).via(...)</a>
</div>
</html>