<?xml version="1.0"?>
<!--
   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.
-->

<document>

 <properties>
  <title>Commons</title>
  <author email="dev@commons.apache.org">Commons Documentation Team</author>
 </properties>

 <body>

<section name="Commons BeanUtils Bean Collections">

<p>
Dealing with collections of beans is a common feature of development in Java.
A lot of time is spent creating bean-specific implementations 
for standard collection manipulators such as functors and comparators.
</p>

<p>
<code>BeanUtils Bean collections</code> is a library intended to 
improve developer productivity by using sophisticated bean introspection 
(from <code>BeanUtils</code>) 
to allow general library classes to be used (rather than creating bean specific
implementation classes).
</p>

<p>
But won't this be slower? Yes, reflection is slower than direct references
but in real life applications, this is typically insignificant. So why not use 
these classes to speed development and then substitute faster implementations only
where the profiler indicates there is a problem :) 
</p>
    <subsection name='Quick-Quick Guide To Functors'>
        <p>
Many of the classes in <code>bean-collections</code> are functor implementations
specialized for bean properties. This is a very quick guide (aimed to let java developer
know why functors make for elegant code).
        </p>
        <p>
The word <code>functor</code> is mathematical in origin but comes into object oriented
development from functional and logic coding. In Java terms, a functor 
is a function that is encapsulated as an object (and so can be manipulated as an object).
This allows elegant, concise and powerful techniques to be used. For example, 
<a href='http://commons.apache.org/collections'>Commons Collections</a>
contains utilities that allow functions (as functors) to be easily applied to 
Collections.
        </p>
        <p>
This is actually pretty useful when it comes to collections of beans. It's a common 
problem to want to extract information from a collection of beans or to change all properties
to a particular value. Functors can be a particularly elegant way to do this. So try them!
You might just like them!
        </p>
        <p>
For more information about functors, please read the introduction to the
<a href='http://commons.apache.org/sandbox/functor/'>Commons Functor component</a>.
        </p>
    </subsection>
</section>
<section name='Releases'>
        <p>
BeanUtils Bean-Collections is distributed as an optional jar within the main 
beanutils distribution. For details, see the 
<a href='http://commons.apache.org/beanutils/index.html'>main BeanUtils website</a>
        </p>
</section>

</body>
</document>
