<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Marciliosi&#039;s Blog</title>
	<atom:link href="http://toobject.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://toobject.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Thu, 18 Mar 2010 22:50:42 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='toobject.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Marciliosi&#039;s Blog</title>
		<link>http://toobject.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://toobject.wordpress.com/osd.xml" title="Marciliosi&#039;s Blog" />
	<atom:link rel='hub' href='http://toobject.wordpress.com/?pushpress=hub'/>
		<item>
		<title>MyAbstractTableModelDinamicForever</title>
		<link>http://toobject.wordpress.com/2010/03/18/myabstracttablemodeldinamicforever/</link>
		<comments>http://toobject.wordpress.com/2010/03/18/myabstracttablemodeldinamicforever/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 22:50:42 +0000</pubDate>
		<dc:creator>Marck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://toobject.wordpress.com/?p=16</guid>
		<description><![CDATA[Quando precisamos utilizar JTables, somos obrigado a fornecer um modelo de dados para ela. Isso se dá usando a classe DefaultTableModel ou criando uma subclasse de AbstractTableModel. O problemas é que muitas vezes, queremos apenas mostrar alguns dados e poder alterá-los. Utilizando DefaultTableModel temos que fornecer um vetor de dados e outro de colunas. Com os dados [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=16&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Quando precisamos utilizar JTables, somos obrigado a fornecer um modelo de dados para ela. Isso se dá usando a classe DefaultTableModel ou criando uma subclasse de AbstractTableModel.</p>
<p>O problemas é que muitas vezes, queremos apenas mostrar alguns dados e poder alterá-los.</p>
<p>Utilizando DefaultTableModel temos que fornecer um vetor de dados e outro de colunas. Com os dados no vetor, a manipulação fica meio complicado por diversos fatores como aumentar sua capacidade.</p>
<p>Outra possibilidade é fornecer um Vector com os dados e outro com as colunas. O Vector é uma classe sincronizada, o que significa perda de performance sendo que muitas vezes não precisaremos de uma estrutura de dados sincronizada.</p>
<p>Criando nossa própria subclasse de AbstractTableModel pode ser um pouco trabalhoso pois poderemos ter diversos TableModels para apenas mostrar dados.</p>
<p>A solução que encontrei foi implementar a classe AbstractTableModel para que receba uma List generica e através de Reflection, acesse os campos tanto para mostrar nas células quanto para atualização.</p>
<p>Para criar a classe de Reflection utilizei o pacote org.apache.commons.beanutils que pode ser baixado em <a href="http://commons.apache.org/beanutils/download_beanutils.cgi">http://commons.apache.org/beanutils/download_beanutils.cgi</a></p>
<p>Utilizando a classe PropertyUtils, temos os métodos setSimpleValue(target, fieldName, data) que atualiza uma propriedade e o método getSimpleValue(target, fieldName), para acessar uma propriedade, desde que a mesma esteja encapsulada (get() set()).</p>
<p>Então, a classe TableModelDinamic ficará assim:</p>
<pre class="brush: java;">
import java.util.List;
import javax.swing.table.AbstractTableModel;
import orquestralibrary.util.Reflection;

public class TableModelDinamic extends AbstractTableModel {

    protected List list;

    protected String[] columnNames;

    public TableModelDinamic() {
        super();
    }

    public TableModelDinamic(List list) {
        setList(list);
    }

    public TableModelDinamic(List list, String [] cols)
    {
        setList(list);
        columnNames = cols;
    }
   
    public int getRowCount() {
        return list.size();
    }

    public int getColumnCount() {

        if(columnNames == null)
            return list.get(0).getClass()
                    .getDeclaredFields().length;

        return columnNames.length;
    }

    public Object getValueAt(int row, int column) {

        return Reflection.getFieldValue(list.get(row), getFieldName(column));
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Reflection.setFieldValue(list.get(rowIndex), getFieldName(columnIndex), aValue);
    }
    private String getFieldName(int idx)
    {
        if(columnNames == null)
            return list.get(0).getClass()
                    .getDeclaredFields()[idx].getName();

        return columnNames[idx];
    }

    @Override
    public String getColumnName(int column) {
        return getFieldName(column);
    }

    public List getList() {
        return list;
    }

    public void setList(List _list) {
        list = _list;
        fireTableDataChanged();
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return true;
    }
}
</pre>
<p>O construtor do nosso model recebe uma lista como argumento no construtor ou uma lista mais os nomes das colunas que serão mostradas na JTable.</p>
<p>Se voce quiser trocar a lista, basta usar o método setList do model.</p>
<p>Para utilizar esta classe, basta apenas instanciar o model passando a sua lista.</p>
<pre class="brush: java;">
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author marciliosouza
 */
public class Frame extends javax.swing.JFrame {

    /** Creates new form Frame */
    public Frame() {
        super(&quot;Simple TableModel&quot;);
        initComponents();
    }

    @SuppressWarnings(&quot;unchecked&quot;)
    // &lt;editor-fold defaultstate=&quot;collapsed&quot; desc=&quot;Generated Code&quot;&gt;
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText(&quot;Proximo&quot;);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jTable1.setModel(getModel());
        jScrollPane1.setViewportView(jTable1);

        jButton2.setText(&quot;Imprimir&quot;);
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton2)
                        .addGap(77, 77, 77)
                        .addComponent(jButton1)))
                .addGap(21, 21, 21))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap())
        );

        pack();
    }// &lt;/editor-fold&gt;

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

        ((TableModelDinamic)jTable1.getModel()).setList(getNextList());
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

        for(Object p : ((TableModelDinamic)jTable1.getModel())
                .getList())
        {
            System.out.println(&quot;Nome .: &quot;+((Pessoa)p).getNome() +&quot; Profissao .: &quot;+ ((Pessoa)p).getProfissao() + &quot; Idade .: &quot;+((Pessoa)p).getIdade());
        }
        System.out.println();
    }

    List&lt;List&lt;Pessoa&gt;&gt; lists;
    int idx = 0;
    public List&lt;Pessoa&gt; getNextList()
    {

        if(lists == null)
        {
            List&lt;Pessoa&gt; list1 = new ArrayList&lt;Pessoa&gt;();

            list1.add(new Pessoa(&quot;Jose&quot;, 33, &quot;Arquiteto&quot;));
            list1.add(new Pessoa(&quot;Maria&quot;, 29, &quot;Medica&quot;));

            List&lt;Pessoa&gt; list2 = new ArrayList&lt;Pessoa&gt;();

            list2.add(new Pessoa(&quot;Marcilio&quot;, 22, &quot;Programdor&quot;));
            list2.add(new Pessoa(&quot;Kelly&quot;, 22, &quot;Psicologa&quot;));

            List&lt;Pessoa&gt; list3 = new ArrayList&lt;Pessoa&gt;();

            list3.add(new Pessoa(&quot;Alexandre&quot;, 24, &quot;Programdor&quot;));
            list3.add(new Pessoa(&quot;Natalia&quot;, 22, &quot;Empresaria&quot;));

            List&lt;Pessoa&gt; list4 = new ArrayList&lt;Pessoa&gt;();

            list4.add(new Pessoa(&quot;Jalim&quot;, 24, &quot;&quot;));

            lists = new ArrayList&lt;List&lt;Pessoa&gt;&gt;();
            lists.add(list1);
            lists.add(list2);
            lists.add(list3);
            lists.add(list4);
        }

        if(idx &lt;= lists.size()-1)
            return lists.get(idx++);

        idx = 0;
        return lists.get(idx);

    }
    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        new Frame().setVisible(true);
    }

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration

    public TableModelDinamic getModel()
    {
        return new TableModelDinamic(getNextList());
    }
}
</pre>
<p>Em alguns casos, mesmo utilizando nosso TableModelDinamic, pode ser preciso criar um model especifico. Um exemplo disso é prcisarmos informar em uma coluna uma &#8220;quantidade&#8221;, em outra o &#8220;preco&#8221; e queremos que em uma terceira coluna, seja mostrado um subtotal.</p>
<p>Neste caso podemos estender TableModelDinamic e fazer estes cálculos no método setValue.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toobject.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toobject.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toobject.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=16&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://toobject.wordpress.com/2010/03/18/myabstracttablemodeldinamicforever/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b1823c8ec6421c307d67426163915469?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Marck</media:title>
		</media:content>
	</item>
		<item>
		<title>List.toEnumarable()</title>
		<link>http://toobject.wordpress.com/2010/03/17/list-toenumarable/</link>
		<comments>http://toobject.wordpress.com/2010/03/17/list-toenumarable/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 19:58:01 +0000</pubDate>
		<dc:creator>Marck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://toobject.wordpress.com/?p=5</guid>
		<description><![CDATA[ As estruturas de dados fornecidos pelo java, se usadas da forma correta são muito boas. Juntando com o poder dos generics e outras malandragens provenientes de nossa imaginação fértil, podemos trabalhar com listas de forma muito flexível e dinâmica. Quando implementei meu tcc (um sistema desktop para uma empresa de Confecções) não sei por que, vi [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=5&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div> As estruturas de dados fornecidos pelo java, se usadas da forma correta são muito boas. Juntando com o poder dos generics e outras malandragens provenientes de nossa imaginação fértil, podemos trabalhar com listas de forma muito flexível e dinâmica.</div>
<p>Quando implementei meu tcc (um sistema desktop para uma empresa de Confecções) não sei por que, vi a necessidade de criar um Framework para me ajudar nesta árdua tarefa e uma das funcionalidades era justamente uma classe para manipular listas de uma forma que achei bem bacana.</p>
<p>Neste sistema, utilizei o JPA. Optei por não usar o Hibernate por não conhecer e também porque queria mesmo ter trabalho.</p>
<p>Utilizando o Netbeans e o JPA, temos a opção de criar &#8220;entidades do banco de dados&#8221;. Isto é muito útil pois será gerado inteiramente de &#8220;grátis&#8221; , as classes com todos os atributos da tabela e seus relacionamentos. Daí pra frente, é só separar os homens dos meninos e fazer as coisas segundo os mandamentos de implementação de equals() e hashCode().</p>
<p>Criei uma classe que herda de List, chamada hummm&#8230;List. Assim, dentro das minhas classes de dados, eu troco a declaração do pacote List do java, apontando para o meu pacote.</p>
<p>Utilizando o engine do JPA, temos muito a ganhar. Como exemplo, temos as querys que são geradas automaticamente, chamadas de namedquerys, que são pré-compiladas quando o contexto é iniciado, nos dando aumento de performance quando executadas. Também, é mantido um contexto onde ficam guardadas as refências  de objetos que já estão gerenciados (vieram do banco e estão em memória) diminuindo a quantidade de acessos ao banco, dependendo de como está a arquitetura do seu sistema.</p>
<p>Depois de trazidos do banco para a memória, uso um tipo de Comparator para coisas como executar um where, ordenação da lista por campos especificos de cada objeto, tirar uma media de valores ou saber quem é maior ou menor.</p>
<p><code>Abaixo, coloco as classes de dados.</code></p>
<pre class="brush: java;">

&lt;code&gt;//imports *
import orquestralist.list.List;&lt;/code&gt;

/**
*
* @author marciliosouza
*/
@Entity
@Table(name = &quot;cliente&quot;)
@NamedQueries({
@NamedQuery(name = &quot;Cliente.findAll&quot;, query = &quot;SELECT c FROM Cliente c&quot;),
@NamedQuery(name = &quot;Cliente.findByIdcliente&quot;, query = &quot;SELECT c FROM Cliente c WHERE c.idcliente = :idcliente&quot;),
@NamedQuery(name = &quot;Cliente.findByCnpjcpf&quot;, query = &quot;SELECT c FROM Cliente c WHERE c.cnpjcpf = :cnpjcpf&quot;),
@NamedQuery(name = &quot;Cliente.findByIerg&quot;, query = &quot;SELECT c FROM Cliente c WHERE c.ierg = :ierg&quot;),
@NamedQuery(name = &quot;Cliente.findByDatacad&quot;, query = &quot;SELECT c FROM Cliente c WHERE c.datacad = :datacad&quot;),
@NamedQuery(name = &quot;Cliente.findByLimite&quot;, query = &quot;SELECT c FROM Cliente c WHERE c.limite = :limite&quot;)})
public class Cliente implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = &quot;idcliente&quot;)
private Integer idcliente;
@Basic(optional = false)
@Column(name = &quot;cnpjcpf&quot;)
private String cnpjcpf;
@Basic(optional = false)
@Column(name = &quot;ierg&quot;)
private String ierg;
@Basic(optional = false)
@Column(name = &quot;datacad&quot;)
@Temporal(TemporalType.TIMESTAMP)
private Date datacad;
@Basic(optional = false)
@Column(name = &quot;limite&quot;)
private long limite;
@OneToMany(cascade = CascadeType.ALL, mappedBy = &quot;cliente&quot;)
private List vendaList;

public Cliente() {
}

//gets sets
}

//imports...

/**
*
* @author marciliosouza
*/
@Entity
@Table(name = &quot;produto&quot;)
@NamedQueries({
@NamedQuery(name = &quot;Produto.findAll&quot;, query = &quot;SELECT p FROM Produto p&quot;),
@NamedQuery(name = &quot;Produto.findByIdproduto&quot;, query = &quot;SELECT p FROM Produto p WHERE p.idproduto = :idproduto&quot;),
@NamedQuery(name = &quot;Produto.findByDescricao&quot;, query = &quot;SELECT p FROM Produto p WHERE p.descricao = :descricao&quot;)})
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = &quot;idproduto&quot;)
private Integer idproduto;
@Basic(optional = false)
@Column(name = &quot;descricao&quot;)
private String descricao;
@OneToMany(cascade = CascadeType.ALL, mappedBy = &quot;produto&quot;)
private List vendaitemList;

public Produto() {
}
}

//imports

/**
*
* @author marciliosouza
*/
@Entity
@Table(name = &quot;vendaitem&quot;)
@NamedQueries({
@NamedQuery(name = &quot;Vendaitem.findAll&quot;, query = &quot;SELECT v FROM Vendaitem v&quot;),
@NamedQuery(name = &quot;Vendaitem.findByIdvendaitem&quot;, query = &quot;SELECT v FROM Vendaitem v WHERE v.idvendaitem = :idvendaitem&quot;),
@NamedQuery(name = &quot;Vendaitem.findByQtde&quot;, query = &quot;SELECT v FROM Vendaitem v WHERE v.qtde = :qtde&quot;),
@NamedQuery(name = &quot;Vendaitem.findByPrecovenda&quot;, query = &quot;SELECT v FROM Vendaitem v WHERE v.precovenda = :precovenda&quot;)})
public class Vendaitem implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = &quot;idvendaitem&quot;)
private Integer idvendaitem;
@Basic(optional = false)
@Column(name = &quot;qtde&quot;)
private int qtde;
@Basic(optional = false)
@Column(name = &quot;precovenda&quot;)
private BigDecimal precovenda;
@JoinColumn(name = &quot;idvendaitem&quot;, referencedColumnName = &quot;idvenda&quot;, insertable = false, updatable = false)
@OneToOne(optional = false)
private Venda venda;
@JoinColumn(name = &quot;produto&quot;, referencedColumnName = &quot;idproduto&quot;)
@ManyToOne(optional = false)
private Produto produto;

public Vendaitem() {
}

//gets e sets

}

//imports
import orquestralist.list.List;

/**
*
* @author marciliosouza
*/
@Entity
@Table(name = &quot;venda&quot;)
@NamedQueries({
@NamedQuery(name = &quot;Venda.findAll&quot;, query = &quot;SELECT v FROM Venda v&quot;),
@NamedQuery(name = &quot;Venda.findByIdvenda&quot;, query = &quot;SELECT v FROM Venda v WHERE v.idvenda = :idvenda&quot;),
@NamedQuery(name = &quot;Venda.findByData&quot;, query = &quot;SELECT v FROM Venda v WHERE v.data = :data&quot;),
@NamedQuery(name = &quot;Venda.findByVlrtotal&quot;, query = &quot;SELECT v FROM Venda v WHERE v.vlrtotal = :vlrtotal&quot;)})
public class Venda implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = &quot;idvenda&quot;)
private Integer idvenda;
@Basic(optional = false)
@Column(name = &quot;data&quot;)
@Temporal(TemporalType.TIMESTAMP)
private Date data;
@Basic(optional = false)
@Column(name = &quot;vlrtotal&quot;)
private BigDecimal vlrtotal;
@JoinColumn(name = &quot;cliente&quot;, referencedColumnName = &quot;idcliente&quot;)
@ManyToOne(optional = false)
private Cliente cliente;
@OneToOne(cascade = CascadeType.ALL, mappedBy = &quot;venda&quot;)
private List vendaitem;

public Venda() {
}

}
</pre>
<p>Agora, alguns usos Lista:</p>
<pre class="brush: java;">
public List&lt;Venda&gt; example(Cliente cli)
    {
        return cli.getVendaList().where(new ICompare&lt;Venda&gt;() {

            public boolean compare(Venda t) {
                return t.getVlrtotal().compareTo(BigDecimal.valueOf(500)) &gt; 0;
            }
        });
    }
</pre>
<pre class="brush: java;">&lt;/pre&gt;
cli.getVendaList().get(0)
                .getVendaitem().where(new ICompare&lt;Vendaitem&gt;() {            public boolean compare(Vendaitem t) {
                return t.getProduto().getDescricao().equals(&quot;Produto1&quot;);
            }
        });

[sourcecode]

[sourcecode language=&quot;java&quot;]
cli.getVendaList().distinct();
[sourcecode]

Obtém o total dos itens do Pedido

[sourcecode language=&quot;java&quot;]

cli.getVendaList().get(0).getVendaitem()
                .sum(new IGetValue&lt;Vendaitem&gt;() {

            public Number getValue(Vendaitem t) {
                return t.getPrecovenda().multiply(BigDecimal.valueOf(t.getQtde()));
            }
        });
</pre>
</pre>
<p>Analisando a classe Cliente, vemos que ela tem um List&lt;Venda&gt;.<br />
Na mesma classe, trocamos a declaralção do pacote para<br />
orquestra.list, e utilizamos a classe List "with" aditivos.<br />
Estes metodos utilitários (where por exemplo) sempre retorna uma lista<br />
tipada mas nunca altera a lista Original.<br />
Para o metodo where, implementamos o metodo compare e o mesmo será<br />
executado para todos os objetos da lista, retornando uma nova lista<br />
com os objetos que retornaram true no metodo compare().<br />
Há outros usos, como tirar uma média como o exemplo abaixo. A interface<br />
IGetValue&lt;Venda&gt; retornará o campo que será usado para o cálculo.</p>
<p>Outro ponto importante aqui é o uso de Generics que nos permite<br />
especificar diretamente os campos que queremos sem precisarmos de<br />
conversão, usar strings (que é o caso de muitos Frameworks) ou<br />
Annotations.<br />
Retorna a media de valores de vendas para o cliente.</p>
<pre class="brush: java;">
    public Number mediaVlrVenda(Cliente cli)
    {
        return cli.getVendaList().avg(new IGetValue&lt;Venda&gt;() {
            public Number getValue(Venda t) {
                return t.getVlrtotal();
            }
        });
    }
</pre>
<p>Retorna a venda com maior valor.</p>
<pre class="brush: java;">    public Number mediaVlrVenda(Cliente cli)
    {
        return cli.getVendaList().max(new Comparator&lt;Venda&gt;() {

            public int compare(Venda o1, Venda o2) {
                return o1.getVlrtotal().compareTo(o2.getVlrtotal());
            }
        });
}
</pre>
<p>Executa um metodo em cada objeto da Lista de itens que esta dentro da</p>
<p>Lista de Vendas e depois a ordena por data de emissão:</p>
<pre class="brush: java;">

        list.forEach(new Action&lt;Venda&gt;() {

            public void action(Venda t) {

                t.getVendaitem().forEach(new Action&lt;Vendaitem&gt;() {
                    public void action(Vendaitem t) {
                        t.setPrecovenda(BigDecimal.ZERO);
                    }
                });
            }
        }).orderBy(new Comparator&lt;Venda&gt;() {

            public int compare(Venda o1, Venda o2) {
                return o1.getData().compareTo(o2.getData());
            }
        });
</pre>
<p>Resumindo, o que pretendo com este post, é tentar mostrar o quanto<br />
listas podem ser extensíveis. Aqui, mostrei poucos exemplos, mas podemos<br />
implementar diversos outros metódos dentro da List para facilitar sua<br />
manipulação.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toobject.wordpress.com/5/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toobject.wordpress.com/5/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toobject.wordpress.com/5/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=5&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://toobject.wordpress.com/2010/03/17/list-toenumarable/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b1823c8ec6421c307d67426163915469?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Marck</media:title>
		</media:content>
	</item>
		<item>
		<title>Hello world!</title>
		<link>http://toobject.wordpress.com/2010/03/16/hello-world/</link>
		<comments>http://toobject.wordpress.com/2010/03/16/hello-world/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 19:51:31 +0000</pubDate>
		<dc:creator>Marck</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[&#8220;Tudo no mundo começou com um sim. Uma molécula disse sim a outra molécula e nasceu a vida. Mas antes da pré-história havia a pré-história da pré-história e havia o nunca e havia o sim. Sempre houve. Não sei o que, mas sei que o universo jamais começou.&#8221; C.L<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=1&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>&#8220;Tudo no mundo começou com um sim. Uma molécula disse sim a outra molécula e nasceu a vida. Mas antes da pré-história havia a pré-história da pré-história e havia o nunca e havia o sim. Sempre houve. Não sei o que, mas sei que o universo jamais começou.&#8221; C.L</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toobject.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toobject.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toobject.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toobject.wordpress.com&amp;blog=12649293&amp;post=1&amp;subd=toobject&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://toobject.wordpress.com/2010/03/16/hello-world/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b1823c8ec6421c307d67426163915469?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Marck</media:title>
		</media:content>
	</item>
	</channel>
</rss>
